容器是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;
}