- 前言
- 一、概览
- 迭代器
- 容器定义和初始化
- 赋值和swap
- 容器大小 *** 作
- 顺序容器 *** 作
- 增
- 改、查
- 删
- 改变容器大小
- vector对象是如何增长的?
- string更多 *** 作
- 构造string
- 搜索
- compare
- 数值转换
- 容器适配器
- 总结
前言
顺序容器:
初始化 | ||
---|---|---|
vector | 可变数组大小。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢 | 默认构造函数创建一个空容器 |
deque | 双向队列。支持快速随机访问。在头尾位置插入/删除速度很快 | 默认构造函数创建一个空容器 |
list | 双向链表。只支持双向顺序访问。在list中任何位置进行插入/删除 *** 作速度很快 | 默认构造函数创建一个空容器 |
forward_list | 单向链表。只支持单项顺序访问。在链表任何位置进行插入/删除 *** 作速度都很快 | 默认构造函数创建一个空容器 |
array | 固定大小数组。支持快速随机访问。不能添加或删除元素 | ××× |
string | 与vector相似的容器,但专门用于保存字符。随机访问快。在尾部插入/删除速度快。 | 默认构造函数创建一个空容器 |
一、概览
vector、deque、list、forward_list、array、string
标准容器迭代器的运算符 | 支持的容器 |
---|---|
*iter | 六种都支持 |
iter->mem | 六种都支持 |
++iter | 六种都支持 |
–iter | 不支持forward_list |
== | 六种都支持 |
!= | 六种都支持 |
部分容器迭代器支持的运算 | 支持的容器 |
---|---|
iter + n | string、 vector、 deque、 array |
iter - n | string、 vector、 deque、 array |
iter += n | string、 vector、 deque、 array |
iter -= n | string、 vector、 deque、 array |
iter1 - iter2 | string、 vector、 deque、 array |
>、 >=、 <、 <= | string、 vector、 deque、 array |
使用左闭合范围蕴含的编程假定
[ .begin(), .end() )
容器::类型别名,如:vector::size_type
begin, rbegin, cbebin, crbegin
//显示指定类型
list<string>::iterator it5 = a.begin();
list<string>::const_iterator it6 = a.cbegin();
//以来于a的类型
auto it7 = a.begin(); // 仅当a是const时,it7是const_iterator
auto it8 = a.cbegin(); // it8是const_iterator
容器定义和初始化
与顺序容器大小相关的构造函数
array除外
标准库array具有固定大小
array<int, 42> //类型为:保存42个int的数组
array<string, 10> //类型为:保存10个string的数组
array<int, 10> ia1; //10个默认初始化的int
array<int, 10> ia2 = {0,1,2,3,4,5,6,7,8,9}; //列表初始化
array<int, 10> ia3 = {42}; //ia3[0]为42,其他为0
赋值和swap
c1 = c2; //拷贝。两容器大小可以不等,数据类型要一样。但是array必须类型相同,大小相等
c1 = {a,b,c}; //array也适用
swap(c1, c2); //交换c1和c2中的元素,c1和c2必须具有相同的类型。
c1.swap(c2); //swap通常比从c2向c1拷贝快的多
//assign *** 作不适用于关联容器和array
seq.assign(b, e); //将seq中的元素替换为迭代器b和e所表示的范围中的元素。
//迭代器不能指向seq中的元素
seq.assign(i); //将seq中的元素替换为初始化列表i中的元素
seq.assign(n, t); //将seq中的元素替换为n个值为t的元素
赋值相关运算会导致指向指向左边容器内部的迭代器、引用和指针失效。而swap *** 作将容器内容交换不会导致指向容器的迭代器、引用和指针失效(array和string除外)
vector<int> vec = {100,200,300};
int &ref = vec[2];
vec = {9,9};
cout << ref << endl; // 输出300,此时ref是个无效值,因为vec.size()==2
cout << *(&ref - 1) << endl; // 9
cout << vec.size(); // 2
list.assign(vector.begin(), vector.end());
list.assign(10, "haha");
vector<string> vec1(10);
vector<string> vec2(24);
swap(vec1, vec2); //vec1.size() == 24, vec2.size()==10。速度快
//相当于仅把命改了改,其他不变
容器大小 *** 作
size empty max_size
顺序容器 *** 作 增顺序容器添加元素
emplace
//直接在容器所管理的内存空间构造对象
c.emplace_back("jlksf", 15, 15.66);
//创建一个临时对象,然后拷贝到容器
c.push_back(Sales_data("jlksf", 15, 15.66));
改、查
resize 不适用于array
c.resize(n); //c.size()==n
c.resize(n, t); //
删
特殊的forward_list *** 作
forward_list<int> flst = {0,1,2,3,4,5,6,7,8,9};
auto prev = flst.before_begin();
auto curr = flst.begin();
while ( curr != end() ){
if (*curr % 2){
curr = flst.erase_after(prev);
}else{
prev = curr;
++ curr;
}
}
改变容器大小
迭代器不是指针
//错误代码
auto begin = v.begin(), end = v.end();
while (begin != end){
//一些处理
++ begin;
begin = v.insert(begin, 42); //end已经失效,不再是 v.end()
++ begin;
}
begin = vec1.insert(begin, *begin++);
begin = vec1.insert(begin, * ++begin);
vector对象是如何增长的?
//shrink_to_fit只适用于vector、string和deque
//capacity和reserve只适用于vecotr和string
c.shrink_to_fit();
c.capacity(); //c最多可以装多少元素
c.reserve(n);
string更多 *** 作
构造string
const char* cp = "Hello World!!!"; //以空字符结尾的数组
char noNull[] = {'H', 'i'}; //不是以空字符结尾的数组
string s1(cp); //✔ cp有空字符
string s2(noNull, 2); //✔
string s3(noNull); //❌ 未定义
string s(s0 [, 开始位置, 个数]);
s.substr([开始位置][,个数]); //返回string
s.append("j;laksjf");
s.replace(position, n, "...")
string::size_type = 0;
while( (pos = name.find_first_of(numbers, pos)) != string::npos ){
++pos;
}
compare
数值转换
to_string(val) | |
stoi(s) | |
stod(s) |
string s2 = "pi = 3.14";
d = stod(s2.substr(s2.find_first_of("+-.0123456789")));
容器适配器
stack queue priority_queue
总结
初始化:
列表初始化 var = {} var{}
默认初始化 var
构造初始化 var(n, v) //取决于构造函数
似乎不正确的初始化 var = (xx)
还有一个值初始化是什么意思?
标准库容器是模板类型,用来保存给定类型的对象。
对容器进行添加或删除元素时,可能导致指向容器中元素的迭代器、指针或引用失效。insert和erase都会返回一个新的迭代器,用以维护容器中的位置。如果循环程序中使用了改变容器大小的 *** 作,需要注意迭代器、指针和引用的使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)