CppPrimer笔记 Chapter9 顺序容器
标签: Cpp
容器库概览(9.2)
- 没有默认构造函数的类,定义容器时不能只传递一个元素数目参数.(我认为是 类中包含一个其他类类型的成员且这个成员的类型没有默认构造函数,则编译器无法初始化该成员.)
class X
{
public:
X(int a,int b) : x(a+b){}
int x;
};
int main()
{
vector<X> XX(10,{1,1});//ok 利用大括号调用X的初始化函数
vector<X> XX(10);//error 没有生成默认初始化函数
9.2.5
- 标准库array
类 允许赋值,赋值号左右两边运算对象需具有相同类型
- 除array
外,swap
不对任何元素进行拷贝.
- 除了string
外指向容器的迭代器,引用,指针在swap后都不会失效
- 对于array
swap
后,指针,引用迭代器所绑定的元素保持不变,但值进行了交换.
- 9.2.7关系运算符(我认为理解成字符串,其实就是按字典排序)
1. 若两个容器具有相同大小且所有元素两两对应相等,则两容器相等
2. 若大小不等,但小容器每个元素的都等于大容器的对应元素,则小容器小于大容器
3. 若两个容器都不是另一个的前缀子序列,则比较结果取决于第一个不相等的元素
顺序容器操作(9.3)
insert
将元素插入到iter指向的元素之前的位置,并返回指向第一个新加元素的迭代器erase(it1,it2)
删除it1
一直到it2
之前的那个元素.调用后it1==it2
substr(be,en)
返回 [be,en) 的共 en−be 个元素的拷贝.若en越界,则仅返回到尾部.- 关于
forward_list
的特殊
- 没有
insert
这样在iter前添加,删除元素的函数,而是insert_after
在iter后添加,删除成员的元素. - 没有
end()
而是before_begin()
返回const_iterator
首元素前不存在的元素的迭代器,无法接引用,用于在收不添加
- 没有
- 向容器添加元素后,可能会使指向容器元素指针,引用或迭代器失效.
- 对
vector
与string
,储存空间被重新分配,则均失效.未重新分配,则插入位置前的有效,之后的失效. - 对
deque
,插入到首尾位置之外的任何位置都会导致迭代器,指针与引用失效. 在首尾插入,迭代器会失效,引用与指针不会.
对
list于
forward_list`,均有效
- 对
- 向容器删除元素后,可能会使指向容器元素指针,引用或迭代器失效.
- 对
vector
与string
,指向被删除元素之前元素的均有效.尾后迭代器必失效 - 对
deque
,在首尾外删除,则指向被删除元素外其他元素的均会失效.删除尾,则仅尾后迭代器失效,删除首,则尾后与其它均不失效(除了被删除的首部) - 对
list
于forward_list
,均有效.
- 对
vector对象是如何增长的(9.4)
- 预分配一段连续的内存,用完后得移动元素.
- capacity 分配的全部的用于储存vecter的连续空间
- size 实际使用的
- reserve 人为调整capacity的函数,但不会使capacity小于size
容器适配器(9.6)
- 意义:一种机制,使某种事物的行为看起来像另一种事物一样. 如下,利用deque构造了stack,然后stk就是一个stack了
- 有
stack
,queue
priority_queue
三种
deque<int> deq;
stack<int> stk(deq);//以拷贝方式构造
stack<string,vector<string>> str_stk;//在vector上实现空栈
cout << std.top() << endl;
std.push(5);
cout << std.size() << endl;
cout << deq.size() << endl;
- 优先队列使用在11.2.2节