刷题基础2-STL总结
总结使用C++刷题时STL的使用
vector
- 初始化:
vector<typename> name;
// vector数组:
vector<typename> arrayname[size];
- 访问:
// 通过下标
vec[i];
// 通过迭代器
vector<typename>::iterator it = name.begin();
*it;
it++;
// 在常用的STL容器中只有vector和string允许使用it+i的用法
*(vec.begin() + i);
- 操作:
vec.push_back(x)
vec.pop_back()
vec.size()
vec.clear() // 清空vector中所有元素
vec.insert(it, x) // 在it所指位置处插入一个元素,当前位置原先的元素及其之后的元素后移
vec.erase(it) // 删除it所指位置的元素
vec.erase(it1, it2) //删除[it1,it2)区间内的所有元素
set
- 初始化:
set<typename> name;
// set数组
set<typename> arrayname[size];
- 访问:
// 通过迭代器
set<typename>::iterator it = name.begin();
*it;
it++;
- 操作:
name.insert(x) // 复杂度O(logn)
name.find(x) // 返回集合中值为x的迭代器,时间复杂度为O(logn)
name.erase(it) // 删除it所指位置的元素,时间复杂度为O(1)
name.erase(x) // 删除集合中值为x的元素,复杂度为0(logn)
name.erase(it1, it2) // 删除[it1, it2)区间内的元素
name.size() // 获取元素的个数,复杂度为O(1)
name.clear() // 清空所有元素,复杂度为O(n)
-
注:
set的作用是去重并升序排序
multiset允许元素重复
unordered_set:其只实现去重不实现排序,速度更快,原理为散列实现代替set的红黑树(自平衡二叉树)实现
string
- 初始化:
string str = "abcd";
cin>>str; cout<<str;
// scanf不能输入string
printf("%s", str.c_str());
- 访问元素:
// 通过下标
// 通过迭代器:
string::iterator it = str.begin();
it++;
*it;
- 常用函数:
str1 += str2; // 将str2拼接到str1后面
str1 = str1 + str2;
// ==, !=, <, <=, >, >=:以字典序比较两个字符串
str.length();
str.size();
str.insert(pos, string); // 从下标为pos的位置开始插入字符串,该位置及其之后的元素全部后移
str.insert(it, it1, it2); // 从it所指位置开始插入it1到it2之间的元素
str.erase(it); // 删除单个元素
str.erase(it1, it2); // 删除一个区间内的所有元素
str.erase(pos, length); // 删除下标为pos开始的length个元素
str.clear(); // 清空元素
str.substr(pos, len); // 取出len个元素
string::npos; // find函数失配时的返回值,常量-1或4294967295
str1.find(str2); // 当str2是str1的子串的时候,返回第一次出现的位置,否则返回string::npos,复杂度为O(mn)
str.replace(pos, len, str2);
str.replace(it1, it2, str2); // 将范围内的字符串替换为str2,修改了原字符串
map
- 初始化:
map<typename1, typename2> mp; // key可以为STL类型,但是不能用数组类型
- 访问元素:
// 元素按照key的大小升序排序
// 通过下标访问
// 通过迭代器:
map<typename1, typename2>::iterator it;
it->first;
it->second;
- 常用函数:
mp.find(key); // 返回key对应的元素的迭代器
mp.erase(it);
mp.erase(key);
mp.erase(it1, it2);
mp.size();
mp.clear();
queue
- 初始化:
queue<typename> name;
- 访问元素:
q.front(); // 最先进入的元素;
q.back();
- 常用函数:
q.front();
q.back();
q.pop();
q.push(x);
q.empty();
q.size();
priority_queue
- 初始化:
priority_queue<typename> name; // 大顶堆
- 访问元素:
q.top();
- 常用函数:
q.push(x); // O(logn)
q.top(); // O(1)
q.pop(); // O(logn)
q.empty(); // O(1)
q.size()
- 自定义优先级队列:
// 基本数据类型:
// 小顶堆:
priority_queue<int, vector<int>, greater<int>> q;
// 大顶堆(默认):
priority_queue<int, vector<int>, less<int>> q;
// 结构体:
// 重载<符号:写在结构体里面
friend bool operator < (student a, student b){
return a.age < b.age;//大顶堆
return a.age > b.age;//小顶堆
}
priority_queue<student> q;
// 重载:写在结构体外面
struct cmp{
bool operator () (fruit f1, fruit f2){
return f1.price < f2.price;//大顶堆
return f1.price > f2.price;//小顶堆
}
}
priority_queue<fruit, vector<fruit>, cmp> q;
stack
- 初始化:
stack<typename> s;
- 访问元素:
s.top();
- 常用函数:
s.push(x);
s.top();
s.pop();
s.empty();
s.size();
pair
- 初始化:
// utility头文件,包含了map头文件也就是包含了utility, map的元素为元组
pair<typename1, typename2> name(e1, e2);
p = make_pair(e1, e2);
- 访问元素:
p.first;
p.second;
- 常用函数:
==, !=, <, <=, >, >=,先比较first,再比较second
algorithm
max(a, b);
min(a, b);
abs(x);
swap(a, b);
reverse(it1, it2); // 将[it1, it2)范围内的元素翻转
next_permutation(a, a + 5); // 返回下一个全排列
fill(a, a + 5, 233); // 将数组指定范围内填充为指定数字
sort(it1, it2, cmp); // it为指针或者迭代器
bool cmp(int i1, int i2){
return i1 > i2;//递减排列
}
lower_bound(it1, it2, val); // 返回第一个>=val的元素, 否则返回可以插入该元素的指针或者迭代器, 找到则返回指针或迭代器
upper_bound(it1, it2, val); // 返回第一个>val的元素
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异