容器的简单介绍

来源:互联网 发布:mysql add user 编辑:程序博客网 时间:2024/06/05 05:28
容器是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 vectorvector<int> test1;cout << "test1的元素个数为:" << test1.size() << endl;//Create dequedouble 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 Listlist<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;}

发现了一些写得比我更好的博客,我就不献丑了,下面式传送门:
点击打开链接
点击打开链接