初始化

每个容器都提供默认构造函数,拷贝构造函数,析构函数。

初值列

可以以一个区间或者初值列作为容器初值。

比如常量容器的初始化:

1
2
3
4
//用初始值初始化一个vector(c++11)<br>
const vector&lt;int&gt; v1 = {1, 2, 3, 4 };
//也可用不同的语法
const vector&lt;int&gt; v2 {1, 2, 3, 4 };

array<>容器使用初值列有特殊规则。将会在array容器中解释。

以某个给定区间初始化的构造函数,参数可以是来自另一个容器、来自c风格的数组、标准输入的元素。可以是不同容器,不同元素类型,前提是来源和目标的元素类型可以自动转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//int元素的list容器
list<int>l;
//拷贝构造给一个float的vector容器
vector<float>c(l.begin(), l.end());
//c++11也可以使用move迭代器来搬移所有元素
vector<string>c2(make_move_iterator(l.begin()), make_move_iterator(l.end()));
//用c风格数组完成初始化
int carray[] = { 1,2,3,4 };
set<int>c3(begin(carray), end(carray));//c++11中iterator定义了begin和end两个函数
//以标准输入设备完成初始化动作
deque<int> c5{ istream_iterator<int>(cin),istream_iterator<int>() };
//c++11中可以使用一个move构造函数将容器初始化
vector<int>v1;
vector<int>v2 = move(v1);//新建容器会有之前的值,被当作初值的容器内容会不明确
						 //因为move函数是调动指针,不是逐一复制元素,效率较高
						 //在不需要某个容器又需要复制时使用move

swap()

用来置换两个容器的内容,事实上知识只换了若干内部的指针,可以保证常数时间复杂度。执行之后原本存在的迭代器和引用都指向原先所指的元素,不过这些元素已经位于另一个容器中了

array<>容器的该函数行为略有不同。因为此容器无法只在内部置换指针,所以array<>的swap()是线性时间复杂度,而且操作之后原本存在的迭代器和引用指向同一容器中的不同元素。

大小相关的操作函数

所有容器都提供三个与大小相关的操作函数

empty():是size()==0同义快速形式,一般比后者效率高。

size():返回当前容器的元素个数。

max_size():返回容器所能容纳的元素个数的最大值。

比较

除了无序容器之外,常用的比较操作符==,!=,<,<=,>,>=都依据以下三个规则定义:

比较的两个容器必须属于同一类型

如果两个容器的元素全部依序相等,则这两个容器相等

无序容器只定义了==,!=

两个容器内的每一个元素都在另一个容器有相等元素,==就返回true,元素次序无关紧要。

如果要比较两个容器,必须使用STL比较算法

元素访问

所有容器都支持基于范围的for循环

c++11中常用的容器访问操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
	//定义一个vector容器
	vector<int>nums = { 1,2,3,4,5,6 };
	//访问每个元素并输出
	for (const auto& elem : nums)
	{
		cout << elem << " ";
	}
	//如果要改变元素就不写const
	for (auto& elem : nums)
	{
		elem = 0;
	}
	//对指定位置进行插入删除等操作,可以使用cbegin()和cend()产生的只读迭代器
	for (auto pos = nums.cbegin(); pos != nums.cend(); ++pos)
	{
		cout << *pos << endl;
	}
	//使用begin()和end()产生的迭代器进行修改
	for (auto pos = nums.begin(); pos != nums.end(); pos++)
	{
		*pos = 0;
	}

常见容器类共通操作表

操作 必要 效果
ContType c 1 默认构造函数,建立一个空容器,array会有默认元素
ContType c(c2) 1 拷贝构造
ContTypr c = c2 1 拷贝构造
ContType c(begin,end)   以区间内所有元素拷贝
ContType c(initlist)   以初值列为初值,不适用于array,c++11
ContType c = initlist   同上,但适用于array
c.~ContType() 1 删除所有元素并释放内存
c.empty() 1 判断容器是否为空
c.size() 1 返回容器中元素数量
c.max_size() 1 返回元素数量可能的最大值
c1 == c2 1 判断两个容器是否相等
c1 != c2 1 判断是否不等
>,<,>=,<=   不适用于无序容器
c = c2 1 c2所有元素值赋给c
c1.swap(c2) 1 置换c1和c2的数据
swap(c1,c2) 1 同上,但是个全局函数
c.begin() 1 返回指向第一个元素的迭代器
c.end() 1 返回指向最后一个元素的下一个位置的迭代器
c.cbegin() 1 返回一个const迭代器,指向第一个元素,c++11
c.cend() 1 返回一个const迭代器,指向最后一个元素的下一个位置,c++11
c.clear()   移除所有元素,令容器为空,不适用于array