PS:删除元素的成员函数并不检查其参数。在删除元素之前,程序员必须确保它们是存在的。
1.迭代器的范围是[begin,end)左闭右开。
2.对构成迭代器的要求:
①它们指向同一个容器中的元素或者容器的最后一个元素之后的位置。
②end不在begin之前。
3.当将一个容器初始化为另一个容器的拷贝的时候,两个容器的容器类型和元素类型都必须相同。但是,当传递迭代器参数来拷贝一个范围的时候,新容器和原容器中的元素类型也可以不同,只要能将要拷贝的元素转换为要初始化的容器的元素类型就可以了。
4.为了使用array类型,我们必须同时指定元素类型和大小
5.虽然我们不能对内置数组类型进行拷贝或对象赋值操作,但是对于array没有限制(需要赋值号左右两边的运算对象必须具有相同的类型,另外不允许用花括号包围的值列表进行赋值)。
6.顺序容器定义了一个名为assign的成员,允许我们从一个不同但是相容的类型赋值,或者从容器的一个子序列赋值。
ps:由于其旧元素被替换,因此传递给assign的迭代器不能指向调用assign的容器。
7.①由于swap操作不对任何元素进行拷贝,删除或者插入操作,因此这个操作很快。(这个操作只是交换了两个容器内部的数据结构,但是对于数组来说的话,就是真的会交换其中的元素。)
②交换array后,指针,引用,和迭代器所绑定的元素保持不变,但是元素值已经在另一个array中对应的元素的值进行了交换。
③string交换后会导致迭代器,引用,指针失效。
8.每个容器类型都支持相等运算符:除了无序关联容器以外所有的容器都支持关系运算符。
9.除了push_back,list和forward_list,deque容器还支持名为push_front的类似操作。
ps:deque除了像vector一样有随机访问元素的能力外,还提供了vector不支持的push_front.
10.关于插入函数insert,第一个参数为一个迭代器,将元素插入到这个迭代器所指向元素的位置之前。
ps:将元素插入的vector,string,deque中的任何位置都是合法的,但是这样做会很耗时。
该迭代器不能指向自己。
11.emplace函数在容器中直接构造元素。传递给amplace函数的参数必须与元素类型的构造函数相匹配。
12.包括array在内的每个顺序容器都有一个front成员函数,而除forward_list之外的所有顺序容器都有一个back成员函数。
调用front,back或者解引用迭代器之前,要确保容器非空,否则这样的操作行为是未定义的。
13.如果希望确保下标是合法的,可以使用at成员函数。at成员函数类似下标运算符,但如果下标越界,at会抛出一个out_of_range异常
14.vector,string不支持push_front,不支持pop_front.Forward_list不支持pop_back.
15.假如erase中输入的两个迭代器相同,返回这个迭代器的值。
16.内置数组的地址其实就可以看成是迭代器。因此在用内置数组给vector或是list初始化的时候可以用其地址代替迭代器,最后的地址要用end函数,得到尾后迭代器。
17.resieze改变容器的大小。c.resize(n);或者c.resize(n,t);
18.如果在一个循环中插入,删除deque,string,vector中的元素,不要缓存end返回的迭代器。
19.list和forward_list是顺序容器但是不支持随机访问,因此其迭代器允许++但是对于+2这样的操作是不允许的,可以用advance(it,2)来完成。
20.只有在执行insert操作时size和capacity相等,或者调用resize或reserve时给定的大小超过当前capacity,vector才可能重新分配内存空间。
21.resize和reserve的区别。前者是改变容器种元素的数量,后者是改变系统预存给这个容器的空间。