1. 初始化顺序容器时,若不使用默认构造函数(vector<int> ivec),则必须指出该容器有多少个元素并提供初值。一种方法是将新创建的容器初始化为一个同类型的已存在的容器副本。
2. 不能直接将一种容器内的元素复制给另一种容器。但可以通过迭代器Iterator来间接实现该功能,且不要求容器类型相同——容器可以不同(可以一个是vector一个是list);元素类型也可以不同,只要满足一个条件:将要被复制的元素可以转换为所构建的新容器的元素类型。这种特性提供了一种用一个容器内的元素子集初始化另一个容器的方法。
3. 指针也是迭代器,可以使用内置数组中的一对指针来初始化一个容器。
4. 用作容器元素的类型须满足:支持赋值运算(即“=”运算符),支持复制操作。除引用(它不支持一般意义的赋值运算)外,所有内置类型或复合类型都可用做元素类型;除IO标准库类型外,其他标准库类型都是有效的容器元素类型。
5. 容器元素都是副本。
6. 新元素的插入在迭代器指向的位置之前,考虑之一是end迭代器指向最后一个元素的下一位置。
7. 任何insert或push操作都可能导致迭代器失效。例如在编写循环元素插入到容器中时,程序必须确保迭代器在每次循环后都得到更新。
8. 赋值和assign操作都会使得左操作数融洽的所有迭代器失效,但是swap操作不会。完成swap操作后,尽管被交换的元素已经存放在另一容器中,但迭代器任然指向相同的元素。
例程:
void main()
{
int arrayIntA[]={1,2,3,4,5};
int arrayIntB[]={10,20,30,40,50};
vector<int> vectorIntA(arrayIntA,arrayIntA+sizeof(arrayIntA));
vector<int> vectorIntB(arrayIntB,arrayIntB+sizeof(arrayIntB));
vector<int>::iterator secondPostion=vectorIntA.begin()+1;
cout<<"secondPostion:"<<*secondPostion<<endl;
vectorIntA.swap(vectorIntB);
cout<<"after swap"<<endl
<<"secondPostion:"<<*secondPostion<<endl;
system("pause");
}
结果:
10. 默认的stack和queue适配器都是基于deque容器实现的,而priority_queue则是基于vector实现的。在创建适配器时,通过讲一个顺序容器指定为适配器的第二个“类型实参”,可覆盖其关联的基础容器类型。如:stack<string, vector<string>>。
stack可以建立在vector、list或者deque上;
queue可以建立在list上;
priority_queue可以健在vector或deque上。