vector
C++中的vector讲解_stl的vector能开几维-CSDN博客
C++ vector 容器浅析 | 菜鸟教程
| 函数 | 作用 |
|---|---|
| size() | 返回元素个数 |
| empty() | 判断是否为空,空返回 true |
| [] | 下标访问元素,和数组一样 |
| front() | 返回第一个元素 |
| back() | 返回最后一个元素 |
| push_back() | 尾部添加元素 |
| emplace_back() | 尾部就地构造元素(效率更高) |
| pop_back() | 删除尾部元素 |
| insert() | 在指定位置插入元素 |
| erase() | 删除指定位置 / 区间元素 |
| clear() | 清空所有元素 |
| begin() | 返回首元素迭代器 |
| end() | 返回尾后迭代器(不指向元素) |
| resize() | 改变容器大小(多删少补) |
| reserve() | 预分配空间,不改变元素个数 |
| swap() | 交换两个 vector 的内容 |
| assign() | 赋值,替换原有所有元素 |
| data() | 返回指向底层数组的指针 |
| shrink_to_fit() | 释放多余空间,让容量 = 大小. |
vector<T> 变量名(元素个数, 初始值);
#include <iostream> #include <vector> using namespace std; int main() { vector<int> v = {10,20,30}; // 1.front():取首元素 cout << v.front() << endl; //10 // 2.back():取末尾元素 cout << v.back() << endl; //30 // 3.push_back:尾部追加 v.push_back(40); // [10,20,30,40] // 4.emplace_back:原地构造,不用拷贝 v.emplace_back(50); // [10,20,30,40,50] // 5.pop_back:删掉末尾 v.pop_back(); // [10,20,30,40] // 6.insert(迭代器位置,值) v.insert(v.begin()+1, 15); //在下标1插入15 → [10,15,20,30,40] // 7.erase:删除单个/区间 v.erase(v.begin()+1); //删掉15 →[10,20,30,40] //v.erase(v.begin(),v.begin()+2); //删除前两个 // 8.clear:全部清空,size=0,capacity不变 //v.clear(); // 9.begin()/end() 迭代器遍历 for(auto it = v.begin(); it != v.end(); ++it) cout << *it << " "; //10.resize(n) 修改有效元素数量,多删少补0 v.resize(6); //不足补0:[10,20,30,40,0,0] v.resize(2); //多余截断:[10,20] //11.reserve(n) 预开容量,不改变size v.reserve(20); //capacity变20,元素不变 //12.swap 交换两个vector vector<int> v2={9,8}; v.swap(v2); //v:{9,8}, v2:{10,20} //13.assign 覆盖全部内容 v.assign(3,7); //全部替换成3个7 →{7,7,7} //14.data() 返回底层原生数组首指针 int* p = v.data(); cout << p[0]; return 0; }list
| 函数 | 核心作用 |
|---|---|
size() | 返回链表的元素个数 |
empty() | 判断链表是否为空,空则返回true |
resize(n) | 修改链表大小为n,多余元素删除,不足补默认值 |
resize(n, val) | 修改链表大小为n,不足的位置填充val |
front() | 获取链表第一个元素 |
back() | 获取链表最后一个元素 |
begin() | 返回指向首元素的迭代器 |
end() | 返回尾后迭代器(不指向任何元素) |
rbegin() | 返回反向首迭代器(从尾部开始遍历) |
rend() | 返回反向尾迭代器 |
push_back(val) | 尾部插入元素 |
emplace_back(val) | 尾部就地构造元素(效率更高) |
push_front(val) | 头部插入元素(list 核心优势) |
emplace_front(val) | 头部就地构造元素 |
insert(it, val) | 在迭代器it指向的位置前插入元素 |
pop_back() | 删除尾部元素 |
pop_front() | 删除头部元素(list 核心优势) |
erase(it) | 删除迭代器it指向的元素 |
clear() | 清空链表所有元素 |
remove(val) | 删除链表中所有值等于 val的元素 |
unique() | 删除链表中连续重复的元素(去重) |
splice(it, other) | 将另一个链表other拼接至当前迭代器位置 |
sort() | 对链表进行升序排序 |
sort(greater<T>()) | 对链表进行降序排序 |
reverse() | 反转整个链表的元素顺序 |
merge(other) | 合并两个有序链表 |
set
| 功能 | 代码写法 | 说明 | 刷题要点 |
|---|---|---|---|
| 插入元素 | st.insert(x); | 插入 x,存在则不变化 | 不会重复,返回 pair,second 标记是否插入成功 |
| 删除指定值 | st.erase(x); | 删除所有值等于 x 的元素(set 唯一,最多删 1 个) | 元素不存在不会报错 |
| 删除迭代器位置 | st.erase(it); | 删除迭代器it指向元素 | O(logn),不要 erase (it++) |
| 查找元素 | auto it = st.find(x); | 找到返回迭代器;找不到返回st.end() | 判断存在:if (st.find(x) != st.end()) |
| 计数 | st.count(x); | 返回 0 或 1(set 元素唯一) | 快速判断是否存在:if(st.count(x)) |
| 清空集合 | st.clear(); | 清空所有元素 | |
| 集合大小 | st.size(); | 返回元素个数 | 返回 size_t,和数字比较注意类型 |
| 是否为空 | st.empty(); | 空返回 true | |
| 第一个元素 | *st.begin() | 最小元素(默认升序) | 空集合不能解引用! |
| 最后一个元素 | *st.rbegin()或*prev(st.end()) | 最大元素 | C++11 支持 prev |
| 下界 >=x | auto it = st.lower_bound(x); | 第一个≥x 的迭代器 | 非常常用,找不到返回 end |
| 上界 >x | auto it = st.upper_bound(x); | 第一个 > x 的迭代器 | |
| 遍历(for) | for(auto v : st) { ... } | C++11 范围 for,从小到大遍历 | 只读,不能修改 v |
| 迭代器遍历 | for(auto it = st.begin(); it != st.end(); ++it) | 顺序遍历 | 用++it效率高于it++ |
| 降序 set | set<int, greater<int>> st; | 从大到小排序 | begin 是最大值 |
set<int> st = {1,3,5,7}; for (auto it = st.begin(); it != st.end(); ++it) { cout << *it << " "; }set<int> st = {1,3,5,7}; for (auto x : st) { cout << x << " "; } // 输出:1 3 5 7pair
C++ pair的基本用法总结(整理)_c++ pair用法-CSDN博客
| 用法 | 代码示例 | 说明 |
|---|---|---|
| 定义 pair 对象 | pair<int,string> p; | 第一个模板参数 first 类型,第二个 second 类型 |
| 初始化 | pair<int,string> p{10,"hello"}; | C++11 列表初始化 |
| make_pair 构造 | auto p = make_pair(20,"test"); | 自动推导类型,不用手写模板参数 |
| 访问成员 | p.first; p.second; | first 取第一个元素,second 取第二个元素 |
| 赋值 | p = make_pair(5,"abc"); | 整体赋值,pair 支持拷贝赋值 |
| pair 作为 map 的元素 | map<string,int> mp;for(auto &item:mp){auto k = item.first;auto v = item.second;``}` | map/unordered_map 内部存储就是pair<const K,V> |
| pair 放入 vector | vector<pair<int,int>> vec;vec.emplace_back(1,2); | vector 存键值对,代替小 map |
| 比较运算符 | pair<int,int> a{1,3},b{2,0};if(a < b){} | 先比 first;first 相等再比 second |
| 返回值(函数返回 pair) | pair<bool,int> func(){return {true,100};} | 函数同时返回 2 个结果 |
| C++17 结构化绑定 | auto [x,y] = p; | 直接拆解 pair 两个值,语法糖 |
| emplace_back 插入 pair | vec.emplace_back(3,4); | 直接构造,不需要手动 make_pair |
map
C++ Map常见用法说明_c++ map用法-CSDN博客
| 功能 | 示例代码 | 说明 |
|---|---|---|
| 定义 map | map<string, int> mp; | key:string,value:int |
| 插入元素 | mp.insert({"mac01", 5}); | insert,key 存在则不覆盖旧值 |
| 下标插入 / 修改 | mp["mac02"] = 10; | key 存在则覆盖 value;key 不存在直接新增 |
| 判断 key 是否存在 | if(mp.count("mac01") != 0) | count 返回 1 存在,0 不存在;O (logN) |
| 查找获取迭代器 | auto it = mp.find("mac01"); | 找到返回迭代器;找不到返回mp.end() |
| 通过迭代器取 key、value | it->first; it->second; | first=key,second=value |
| 删除(按 key) | mp.erase("mac01"); | 删除 key 对应的整条记录 |
| 删除(按迭代器) | mp.erase(it); | 删除迭代器指向元素,it 失效 |
| 获取大小 | mp.size() | 返回键值对数量 |
| 判空 | mp.empty() | 为空返回 true |
| 清空全部元素 | mp.clear() | 清空所有 key‑value |
| 遍历(范围 for) | for(auto &item : mp){auto k = item.first;auto v = item.second;} | 按 key 从小到大遍历 |
| 迭代器遍历 | for(auto it=mp.begin();it!=mp.end();it++) | begin 最小 key,end 尾后迭代器 |
| C++17 结构化绑定遍历 | for(auto& [k,v] : mp){} | 直接拆解 key、value |
| 获取值(find 安全版本) | auto it = mp.find("mac01");if(it!=mp.end()){ int val = it->second; } | 推荐;不会插入新元素 |
| 下标取值注意 | int val = mp["mac01"]; | ❗key 不存在,会自动插入一条默认 value 记录 |
map<string,int> mp; int x = mp["aaa"]; // 即使只想读,也会插入 ("aaa",0),改变容器!
map 只对key 排序,value 不参与排序;不能通过 value 找最小,必须手写循环。
map 里面的 pair 是pair<const K,V>,item.first(key)不能改,item.second(value)可以修改
stack
pop()函数只删除栈顶元素,不返回该元素的值。如果需要获取栈顶元素并删除,需先调用top()获取值,再调用pop()删除;
queue
https://blog.csdn.net/Maysheeo/article/details/149908000
deque
| 函数 | 作用 |
|---|---|
push_back(x) | 尾部插入元素 |
push_front(x) | 头部插入元素 |
emplace_back(x) | 尾部就地构造(效率更高) |
emplace_front(x) | 头部就地构造(效率更高) |
pop_back() | 删除尾部元素 |
pop_front() | 删除头部元素 |
front() | 获取队头元素 |
back() | 获取队尾元素 |
size() | 返回元素个数 |
empty() | 判断是否为空 |
resize(n) | 修改大小为 n |
clear() | 清空所有元素 |
operator[] | 下标随机访问(如dq[2]) |
at(i) | 安全访问,越界抛异常 |
begin() | 返回首迭代器 |
end() | 返回尾迭代器 |
priority_queue
【C++】STL——容器适配器priority_queue(优先级队列)详解 及 仿函数的介绍和使用-腾讯云开发者社区-腾讯云
C++ 容器类 <priority_queue> | 菜鸟教程
https://zhuanlan.zhihu.com/p/679669848
| 函数 | 作用 | 示例 |
|---|---|---|
.push(x) | 插入元素 x,自动堆化 | q.push(5); |
.top() | 获取堆顶元素(最值),不删除 | int val = q.top(); |
.pop() | 删除堆顶元素,无返回值 | q.pop(); |
.empty() | 判断堆是否为空,空返回 true | if (!q.empty()) |
.size() | 返回堆内元素个数 | int sz = q.size(); |
unordered_set
- 唯一性:元素值唯一,重复插入会被忽略。
- 无序性:元素不按特定顺序存储,遍历顺序不确定。
- 高效查找:哈希表实现,平均O(1)时间复杂度完成插入、删除、查找。
- 迭代器类型:提供双向迭代器(但反向遍历无意义,因元素无序)。
| 操作函数 | 功能作用 |
|---|---|
| insert(val) | 插入元素 val |
| emplace(val) | 原地构造插入,效率更高 |
| erase(val) | 删除值为 val 的元素 |
| erase(iterator) | 删除迭代器指向的元素 |
| clear() | 清空所有元素 |
| find(val) | 查找 val,返回迭代器;找不到返回 end () |
| count(val) | 判断 val 是否存在,存在返回 1,不存在返回 0 |
| size() | 返回容器中元素个数 |
| empty() | 判断容器是否为空 |
| begin() | 返回指向第一个元素的迭代器 |
| end() | 返回尾后迭代器(不指向元素) |
| cbegin() | 返回常量首迭代器 |
| cend() | 返回常量尾后迭代器 |
unordered_map
- 键值对存储,键唯一不可重复
- 平均时间复杂度:查找 / 插入 / 删除O(1)
- 无序,遍历顺序不固定
| 函数 | 核心作用 |
|---|---|
empty() | 判断哈希表是否为空,空则返回true |
size() | 返回哈希表中键值对的个数 |
operator[](key) | 通过键访问值;键不存在则自动插入,默认值初始化 |
at(key) | 安全访问键对应的值,键不存在会抛出异常 |
insert({key, value}) | 插入一组键值对,键已存在则不覆盖 |
emplace(key, value) | 就地构造键值对,插入效率比insert更高 |
erase(key) | 删除指定键对应的键值对 |
erase(iterator) | 删除迭代器指向的键值对 |
clear() | 清空哈希表所有元素 |
find(key) | 查找指定键,返回对应迭代器;找不到返回end() |
count(key) | 判断键是否存在,存在返回1,不存在返回0 |
begin() | 返回指向首元素的迭代器 |
end() | 返回尾后迭代器(不指向任何元素) |
cbegin() | 返回常量首迭代器 |
cend() | 返回常量尾后迭代器 |
reserve(n) | 预分配n个元素空间,减少扩容次数 |
string
| 函数写法 | 功能说明 | 示例代码 |
|---|---|---|
string s;string s("abc");string s(n, 'ch'); | 构造字符串:1. 空串2. 用字符串初始化3. n 个重复字符 | string a;string b("hello");string c(5, 'x'); // "xxxxx" |
s.size()s.length() | 获取字符串有效字符长度,两者完全等价 | string s = "1234";int len = s.size(); // len=4 |
s.empty() | 判断字符串是否为空,空返回 true | if (s.empty()) cout << "空字符串"; |
s.clear() | 清空字符串,变为空串 | s.clear(); // s = "" |
s += "xxx"s += 'a' | 字符串拼接,追加内容 | string s = "ab";s += "cd"; // s="abcd"s += 'e'; // s="abcde" |
s.push_back('c') | 末尾追加单个字符(只能 char) | s.push_back('z'); |
s.pop_back() | 删除最后一个字符,无返回值 | string s="abc"; s.pop_back(); // s="ab" |
s.substr(pos, len) | 截取子串:pos = 起始下标,len = 截取长度省略 len 则截取到末尾 | string s = "abcdef";s.substr(1,3); // "bcd"s.substr(2); // "cdef" |
s.erase(pos, len) | 删除:从 pos 开始删 len 个字符只传 pos:删到末尾 | string s="abcdef";s.erase(1,2); // 删除bc → adef |
s.replace(pos, len, newStr) | 从 pos 起,删除 len 个字符,替换为新字符串 | string s="a123d";s.replace(1,3,"bc"); // "abcd" |
s.find(str) | 正向查找子串 / 字符,返回首次出现下标找不到返回string::npos | string s="abcb";int pos = s.find("cb"); // pos=2if (s.find('x') == string::npos) 无匹配 |
s.rfind(str) | 反向查找,返回最后一次出现下标 | s.rfind('b'); // 3 |
s.compare(t) | 比较字符串:s==t 返回 0s<t 返回负数s>t 返回正数 | if (s.compare("abc") == 0) 相等 |
s[n]/s.at(n) | 访问下标 n 字符:[]不越界检查;at()越界抛异常 | char c = s[0];char d = s.at(1); |
s.insert(pos, str) | 在 pos 下标处插入字符串 | string s="ad";s.insert(1,"bc"); // abcd |
stoi(s) | string 转 int(纯数字字符串) | string num = "123"; int x = stoi(num); |
to_string(val) | 数字 (int/double 等) 转 string | string s = to_string(666); // "666" |
<algorithm>
| 函数 | 作用 |
|---|---|
find(begin,end,val) | 查找第一个等于 val 的元素,返回迭代器;找不到返回 end |
find_if(begin,end,pred) | 查找第一个满足谓词 pred 的元素 |
find_if_not(begin,end,pred) | 查找第一个不满足 pred 的元素 |
count(begin,end,val) | 统计等于 val 的元素个数 |
count_if(begin,end,pred) | 统计满足谓词的元素个数 |
binary_search(begin,end,val) | 有序区间,判断 val 是否存在,返回 bool |
lower_bound(begin,end,val) | 有序区间,第一个≥val 的迭代器 |
upper_bound(begin,end,val) | 有序区间,第一个 > val 的迭代器 |
equal_range(begin,end,val) | 返回 pair<lower,upper>,val 的范围 |
| 函数 | 作用 |
|---|---|
sort(begin,end) | 快速排序,升序;可传自定义比较器sort(v.begin(),v.end(),greater<int>()) |
stable_sort(begin,end) | 稳定排序,相等元素相对顺序不变 |
partial_sort(beg,mid,end) | 部分排序:前 mid‑beg 个元素排好序 |
nth_element(beg,nth,end) | 把 nth 位置放到它最终排序后的位置,左右不一定有序,找第 k 大 / 小 |
is_sorted(begin,end) | 判断区间是否有序,返回 bool |
partition(begin,end,pred) | 把满足 pred 放左边,不满足放右边;不稳定 |
stable_partition(begin,end,pred) | 分区,保持组内相对顺序 |
| 函数 | 作用 |
|---|---|
copy(src_beg,src_end,dst_beg) | 拷贝到目标迭代器;目标要足够空间,常配合back_inserter |
copy_if(src_beg,src_end,dst_beg,pred) | 拷贝满足条件的元素 |
fill(begin,end,val) | 全部填充 val |
fill_n(begin,n,val) | 从 begin 开始 n 个元素赋值 val |
generate(begin,end,gen_func) | 用生成函数给每个元素赋值 |
generate_n(begin,n,gen_func) | 生成 n 个 |
replace(begin,end,old_val,new_val) | 把等于 old_val 替换成 new_val |
replace_if(begin,end,pred,new_val) | 满足条件就替换 |
swap(a,b) | 交换两个对象 |
iter_swap(it1,it2) | 交换两个迭代器指向元素 |