容器是STL的基础,容器分2种:

序列式容器(sequential container)

关联式容器(associative container)

序列式容器会强调元素的次序,依次维护第一个元素、第二个元素……,直到最后一个元素,面向序列式容器的操作主要是迭代操作。

 

 

 

本节讨论序列式容器vector、list和deque的用法,以及序列式容器的共同操作。

使用序列式容器,须包含相关的头文件,vector、list及deque分别对应:

#include <vector> 

 

  #include <list> 

 

  #include <deque>

创建序列式容器的对象,大体有5种方式:

(1) 创建空的容器,此时容器中的元素个数为0。

vector<int> obV; 

 

  list<float> obL; 

 

  deque<double> obD;

 

(2)vector<double> obV(10); //vector型对产生特定大小的容器,此时容器中的元素被创建,编译器使用默认值为元素隐式初始化,像int、float和double等内建的数据类型会被初始化为0,对于类对象元素,将调用其无参构造函数(用户定义的或编译器缺省提供的)或每个参数都有默认值的构造函数。象obV中含10个double型元素, 初始化为0

list<int> obL(20); //list型对象obL中含20个int型元素, 初始化为0 

 

  deque<float> obD(30); //deque型对象obD中含30个float型元素, 初始化为0

(3)在(2)的基础上更进一步,创建特定大小的容器,并且为其中的每个元素指定初始值,此时在元素多少的参数后增加一个参数。

vector<int> obV(10,8); //10个int型元素, 每个都初始化为8 

 

  list<double> obL(20,3.1); //20个double型元素, 每个都初始化为3.1 

 

  deque<string> obD(30,"Hello"); //30个string型元素, 每个都初始化为"Hello"

(4)根据已有同类型的容器创建新容器,并将其中的元素完全复制过来,设obV1、obL1和obD1都是现成的容器,里面存储的数据均为int型,则可用下述命令创建新容器

vector<int> obV2(obV1); //或vector<int> obV2=obV1; 

 

  list<int> obL2(obL1); //或list<int> obL2=obL1; 

 

  deque<int> obD2(obD1); //或deque<int> obD2=obD1;

 

(5)通过一对迭代器(可暂时理解为指针),以使编译器决定元素的个数和初值,这对迭代器用以标识一组元素区间。

int sz[5]={11,2,3,4,45}; 

 

  vector<int> obV(sz, sz+5); 

 

  list<int> obL(sz, sz+5); 

 

  deque<int> obD(sz, sz+5);

vector和deque类的容器创建后就可以通过容器名[下标]或容器名.at(序号)的形式对元素进行随机访问(这是因为这2种类模板对下标运算符[]进行了重载);也支持迭代器访问。

但list类的容器不支持下标运算符[],无法使用[]对元素进行随机访问。但支持双向迭代器访问,如:

list<int>::iterator iter = obL.begin();

动手敲一敲的示例代码:

#include <iostream>
#include<vector>
#include<list>
#include<deque>
using namespace std;

int main() {
	// Create an empty vector
	vector<int> test1;
	cout << "test1的元素个数为:" << test1.size() << endl;

	//Create deque

	double sz[5] = { 1,2,3,4,5 };
	deque<double> test2(sz, sz + 5);
	for (int i = 0; i < test2.size(); i++) {
		cout << test2[i] << " ";
	}
	cout << endl;
	deque<double>::iterator id = test2.end();
	while (id != test2.begin()) {
		id--;//注意的是id指向的是最后一个元素的下一个迭代器
		cout << (*id) << " ";
	}
	cout << endl;
	//Create List
	list<float> test3(3, 5); //list不支持下标访问
	list<float>::iterator it = test3.begin();
	while (it != test3.end()) {
		(*it) += 2;
		cout << (*it) << " ";
		it++;
	}
	cout << endl;

	//再创建一个List容器,使其内容与test3内容进行交换
	list<float> test4(4, 9);
	test3.swap(test4);
	for (it = test3.begin(); it != test3.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;

	system("pause");
	return 0;
}