目录
- 顺序容器
顺序容器
选择什么容器根据业务需求, 研读STL剖析了解底层数据结构, 更加清楚各种优势劣势
零碎点
- 迭代器被设置为左闭右合带来的编程假设
- begin == end,范围为空
- begin != end, 至少一个元素
- begin可递增至end
- 两大类型的容器初始化——同类型容器拷贝,迭代器范围拷贝
- 前者要求容器类型一致
- 后者只要求元素可转换
- 两大类型的容器赋值——=号赋值,assign赋值
- 前者用于列表或同类型容器
- 后者用于迭代器,初始化列表,(n,elem)方式;限制顺序容器
- swap交换容器内容
除Array,其他容器只是交换数据结构,不涉及元素拷贝插入删除,常数时间
- 失效内容:除了string容器,其他的都不失效,但是已经转换了容器,而Array则是转换了值
- 容器之比较——任何容器都支持== !=;除无序关联(unordered的关联容器)外,其他都支持< > <= ……各种比较
容器的== !=由元素的==实现;其他由<实现;
然而<也足以推断==情况(交换位置多比一次即可)
顺序容器的操作
失效操作请剖析STL
以下增删改查针对绝大多数顺序容器
- 增——拷贝
emplace区别主要是可用提供初始化器而非元素对象
front_list有自己的insert和emplace,只支持下面的front型操作 .push_back(t) .emplace_back(args) args是可用以来初始化元素的东西 .push_front(t) vecotr和string不支持,费时 .emplace_front(args) vecotr和string不支持 .insert(p, t) 这个及以下的都返回插入元素的迭代器 .emplace(p, args) .insert(p, n, t) n个t .insert(p, b, e) 迭代器范围 .insert(p, il) il,初始化列表 - 查(访问)——引用访问
空或越界除了at外,都未定义 | |
---|---|
.back() | |
.front() | |
[] | 和at只能用于vec,str,deque,arr |
.at() | 下标越界,返回out_of_range |
- 删
不检查合法性 | |
---|---|
.pop_back() | f_l不支持 |
.pop_front() | vec, str不支持 |
.erase(p) | 迭代器 |
.erase(b, e) | 范围 |
.clear() | 清空 |
- 改变大小
.resize(n) | |
.resize(n, t) | 若为增大,新元素初始化为t |
- 容量操作——vector,string,deque
deque不支持后两个 | |
---|---|
.shrink_to_fit() | capacity减小到size |
.capacity() | |
.reserve(n) | 小于等于当前什么都不做 |
强制释放或缩小vector内容
// 强制释放
vector<int> vec;
{
vector<int>().swap(vec);
}
// 强制缩小
vector<int> vec;
swap(vector<int>(vec), vec);
迭代器失效情况 // TODO底层?
指针、迭代器、引用,失效指不再表示任何元素
- 增
- vector和string,
- 内存重分配——全部失效
- 未重分配——插入位置后的全失效
- deque
- 非首尾——全部失效
- 首尾——迭代器失效,其他有效
- list和forward_list,全都有效
- vector和string,
- 删
- vector和string
- 被删除点后全部失效
- deque
- 非首尾——全部失效
- 首尾——首迭代器或尾迭代器失效
- list和forward_list,除删除点全都有效
- vector和string
特立独行者——front_list
它是单向链表,获取前驱比较麻烦
.before_begin() | 表头前不存在的元素,不可解引用 |
.insert_after(p, t) | 返回最后一个插入的元素的迭代器 |
.insert_after(p, n, t) | |
.insert_after(p, b, e) | |
.insert_after(p, il) | |
.emplace_after(p, args) | |
.erase_after(p) | 返回被删除元素的后一个元素的迭代器 |
.erase_after(b, e) |
string的额外操作
- 构造的其他方法
string s(cp, n) | cp是字符数组指针 |
string s(str2, pos2) | str2是已存在string |
string s(s2, pos2, len2) |
- s.substr(pos, n) // 返回子串
- 修改
.insert(pos, args) | pos可以是下标,返回引用;可以是迭代器,返回迭代器 |
.erase(pos, len) | len省略删完,返回引用 |
.assign(args) | 返回引用 |
.append(args) | 返回引用 |
.replace(range, args) | range可以是pos,n(下标长度)或者b,e(迭代器),返回引用 |
- 搜索
找到返回下标,没有就string::npos(一个string::size_type值,-1,但是因为无符号,所以是最大值) | |
---|---|
.find(args) | 第一次出现位置 |
.rfind(args) | 最后一次出现位置 |
.find_first_of(args) | args中任意字符第一次出现 |
.find_last_of(args) | |
.find_first_not_of(args) | 第一个不再args中的字符 |
.find_last_not_of(args) |
- 比较.compare
参数格式;返回值:0等于 >0大于 <0小于 n表示长度 s2 pos1, n1, s2 pos1, n1, s2, pos2, n2 cp pos1, n1, s2 pos1, n1, cp, n2 - 数制转换
to_string(val) | |
stoi(s, p, b) | 后面都一样,s字符串,p是size_t指针,保存第一个非数字内容的下标 |
stol | b是转换基数 |
stoul | 整型不识别e |
stoll | |
stoull | |
stof(s, p) | 识别e |
stod | |
stold |
适配器操作
- 通用操作
.empty() | |
.size() | |
.swap() | |
swap(a, b) | |
- stack——默认基于deque,可用list或vector,用模板第二个参数修改
.pop() | 删除而不返回 |
.push(item) | |
.emplace(args) | |
.top() | 可修改 |
- queue——基于deque,可list或vector
.front() | 可修改 |
.back() | |
.pop() | |
.push(t) | |
.emplace(args) |
- priority_queue——基于vector,可deque
.pop() | |
.top() | 不能修改 |
.push() | |
.emplace() |
原文地址:https://www.cnblogs.com/YanceW/p/11695611.html
时间: 2024-10-10 14:51:02