一、模板的简介,函数模板与类模板的用法;
二、容器的简介,容器的分类,各个容器的数据结构;
三、容器vector的具体用法(包括迭代器的具体用法)。
vector<int>vecInt; //一个存放int的vector容器。
vector<float>vecFloat; //一个存放float的vector容器。
vector<string>vecString; //一个存放string的vector容器。
... //尖括号内还可以设置指针类型或自定义类型。
ClassCA{};
vector<CA*>vecpCA; //用于存放CA对象的指针的vector容器。
vector<CA>vecCA; //用于存放CA对象的vector容器。由于容器元素的存放是按值复制的方式进行的,所以此时CA必须提供CA的拷贝构造函数,以保证CA对象间拷贝正常。例如: vector<int> vecInt;
vecInt.push_back(1);vecInt.push_back(3);
vecInt.push_back(5);vecInt.push_back(7);
vecInt.push_back(9);
此时容器vecInt就包含了按顺序的1,3,5,7,9元素。
如果在此基础上再运行语句vecInt.pop_back();
vecInt.pop_back();此时容器vecInt就包含了按顺序的1,3,5元素。
输入迭代器:也有叫法称之为“只读迭代器”,它从容器中读取元素,只能一次读入一个元素向前移动,只支持一遍算法,同一个输入迭代器不能两遍遍历一个序列。
输出迭代器:也有叫法称之为“只写迭代器”,它往容器中写入元素,只能一次写入一个元素向前移动,只支持一遍算法,同一个输出迭代器不能两遍遍历一个序列。正向迭代器:组合输入迭代器和输出迭代器的功能,还可以多次解析一个迭代器指定的位置,可以对一个值进行多次读/写。
双向迭代器:组合正向迭代器的功能,还可以通过--操作符向后移动位置。
随机访问迭代器:组合双向迭代器的功能,还可以向前向后跳过任意个位置,可以直接访问容器中任何位置的元素。
目前本系列教程所用到的容器,都支持双向迭代器或随机访问迭代器,下面将会详细介绍这两个类别的迭代器。it++, ++it, it--, --it,*it, itA = itB,
itA== itB,itA != itB
其中list,set,multiset,map,multimap支持双向迭代器。
在双向迭代器的操作基础上添加
it+=i,it-=i, it+i(或it=it+i),it[i],
itA<itB, itA<=itB, itA>itB, itA>=itB 的功能。
其中vector,deque支持随机访问迭代器。例如:vecInt是用vector<int>声明的容器,假设已经包含了按顺序的1,3,5,7,9元素。
vector<int>::iterator it; //声明容器vector<int>的迭代器。
运行it=vecInt.begin(); //此时*it==1。
运行++it; // 或者it++; 此时*it==3,前++的效率比后++的效率高,前++返回引用,后++返回值。
运行it+= 2; //此时*it==7。
运行it= it +1; //此时*it=9。
运行++it; //此时it==vecInt.end(); 此时不能再执行*it;假设vecInt是用vector<int>声明的容器,里面包含按顺序的1,3,5,7,9元素。
for(vector<int>::iteratorit=vecInt.begin(); it!=vecInt.end(); ++it)
{
int iItem = *it;
cout << iItem; //或直接使用 cout << *it;
}
这样子便打印出13 5 7 9如:
vector<int>::const_iterator
vector<int>::const_reverse_iterator
这两种分别是
vector<int>::iterator
vector<int>::reverse_iterator
的只读形式,使用这两种迭代器时,不会修改到容器中的值。
备注:不过容器中的insert和erase方法仅接受这四种类型中的iterator,其它三种不支持。《EffectiveSTL》建议我们尽量使用iterator取代const_iterator、reverse_iterator和const_reverse_iterator。例如 vecInt是vector<int> 声明的容器,现已包含1,2,3元素。
执行vecInt.resize(5); //此时里面包含1,2,3,0,0元素。
再执行vecInt.resize(8,3); //此时里面包含1,2,3,0,0,3,3,3元素。
再执行vecInt.resize(2); //此时里面包含1,2元素。例如: vecInt是用vector<int>声明的容器,现已包含按顺序的1,3,5,6,9元素。
vector<int>::iteratoritBegin=vecInt.begin()+1;
vector<int>::iteratoritEnd=vecInt.begin()+3;
vecInt.erase(itBegin,itEnd);
// 此时容器 vecInt 包含按顺序的 1,6,9 三个元素例如 vecInt是用vector<int>声明的容器,现已包含按顺序的1,3,2,3,3,3,4,3,5,3元素。现要求删除容器中所有等于3的元素。
for(vector<int>::iteratorit=vecInt.being(); it!=vecInt.end(); ) //小括号里不需写 ++it
{
if(*it == 3)
{
it = vecInt.erase(it); //以迭代器为参数,删除元素3,并把数据删除后的下一个元素位置返回给迭代器。
//此时,不执行 ++it;
}
else
{
++it;
}
}一、模板的简介,函数模板与类模板的用法
类型参数化
二、容器的简介,容器的分类,各个容器的数据结构
vector,deque,list,set,multiset,map,multimap
三、容器vector的具体用法(包括迭代器的具体用法)。
vertor简介,vector使用之前的准备,vector对象的默认构造,vector末尾的添加移除操作,vector的数据存取,迭代器的简介,双向迭代器与随机访问迭代器
vector与迭代器的配合使用,vector对象的带参数构造,vector的赋值,vector的大小,vector的插入,vector的删除。