C++中的所有容器都支持三个核心能力:
- 所有容器提供的都是‘value语义’而非‘reference语义’。可以通过指针元素来实现某些功能。
- 容器的所有元素有一个固定的次序(order),你可以以相同的次序多次遍历每个元素。并且每个容器也提供“迭代器生成器”函数,运用这些生成的迭代器可以遍历整个容器。
- 你无法保证程序的每个操作都安全。操作者必须确保操作函数的参数都符合要求,因为容器不会抛出异常。
容器(Container)的共通操作函数集(使用ContType表示所有容器类型):
函数 | 功能 |
---|---|
ContType c | 产生一个不含有任何元素的空容器 |
ContType c1(c2) | 产生一个一模一样的容器,所有元素都是按值复制的 |
ContType c(beg, end) | 复制p[beg, end)区间内的元素,作为容器初值 |
c.~ContType() | 删除所有元素 |
c.size() | 返回容器中的元素数量 |
c.empty() | 判断容器是否为空,相当于(size()==0),但这个函数可能更快 |
c.maxsize() | 返回元素的最大可能数量 |
c1==c2 | 判断是否c1等于c2 |
c1!=c2 | 判断是否c1不等于c2 |
c1 < c2 | 判断是否c1小于c2 |
c1 > c2 | 判断是否c1大于c2 |
c1 <= c2 | 判断是否c1小于等于c2 |
c1 >= c2 | 判断是否c1大于等于c2 |
c1 = c2 | 将c2的元素拷贝复制给c1 |
c1.swap(c2) | 将c1和c2的值做个交换 |
swap(c1, c2) | 这是个全局函数,功能同上 |
c.begin() | 返回一个迭代器,指向第一个元素 |
c.end() | 返回一个迭代器,指向最后一个元素的下一位置,它并不指向最后一个元素 |
c.rbegin() | 返回一个迭代器,指向倒数第一个元素 |
c.rend() | 返回一个迭代器,指向第一个元素的前一位置,它并不指向第一个元素 |
c.insert(pos, elem) | 将elem的一个副本安插于pos处,返回值和pos的意义并不相同 |
c.erase(beg,end) | 移除[beg, end)区间内的所有元素,某些容器会返回没有被移除的第一个元素 |
c.clear() | 移除所有元素,令容器为空 |
c.get_allocator() | 返回容器的内存模型(memory model) |
以下为一些实例,对上述部分函数做个说明:
构造函数(从区间中拷贝元素):
int array[] = {1,2,32,3,4,5}; set<int> s(array, array+sizeof(array)/sizeof(array[0]));
构造函数(从标准输入装置读取元素完成初始化操作,标准输入装置方法见博客):
std::deque<int> d((std::istream_iterator<int>(std::cin)), std::istream_iterator<int>());
//注意std::istream_iterator<int>(std::cin)这条语句在c++中是个声明,不能作为参数,需要在两边加上(),表示这是一个表达式。
交换函数(c1.swap(c2)) / swap(c1, c2) ):
采用赋值构造函数来创建新的容器,之后源容器就不再使用了,这样赋值构造函数会再生成每个元素的拷贝,然后将源容器中的每个元素再删除掉。而且随着元素个数的增长,所需的时间也会增长(O(n)),而如果使用swap()函数,所做的操作仅仅是将两个容器内部的某些指针(指向元素、配置器)进行交换,所需时间为常数时间(O(C))。这就是swap函数的一个应用场景。