c++中的容器有顺序容器和关联容器,顺序容器中有vector,list,deque这三种,我个人的理解,vector就像是c语言中的数组,当然,这个使用起来是比数组方便很多,集成度更高,list就是数据结构中的链表,而deque则就是数据结构中的双端队列。顺序容器适配器;stack这就是数据结构中的栈,queue这就是数据结构中的队列,还有有优先级管理的队列,priority_queue,这些都是类模板,使用起来的话,都要包含相关的头文件<vector><list><deque>,这几个。
我这个主要是作为一个笔记吧!主要记录一下,这些容器的操作:
C<T> c;这是创建一个名为c的空容器,T就是元素的类型,C代表就是容器,还有一种就是C c(b,e);创建容器c,其元素就是迭代器b和e标示范围内的元素的副本。
C c(c2),创建容器c2的副本,c和c2必须要具有相同的容器类型,并存放相同的元素。
C c(n,t);这是用n个t的元素创建容器c,其中t必须是容器类型c的元素类型的值。
以上主要就是顺序容器的创建的方法。
接下来就是如何操作容器中的元素,这里首先是如何读取容器中的元素,当然,其中一个方法就是像数组一样通过下标读取,c[i];这样的方式,我这儿要说的就是一种类似于c语言中的指针的机制来读取的方式,就是迭代器方式。
比如:有一道面试题,将字符串倒叙输出,例如输入:首先输入你要输入的字符串的个数,然后倒叙输出,abc,def,hig,输出的则是:hig,def,abc;这道题,我们可以使用适配器stack,这本身就是一个栈,所以,遵从先进后出的特征,也可以用vector容器,
如下程序:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
vector<string> c;
int n,i;
string s;
vector<string>::iterator ci;//定义容器迭代器;
while(cin>>n)
{
for(i=0;i<n;i++)
{
cin>>s;
c.push_back(s);
}
for(ci=c.end()-1;ci>=c.begin();ci--)
{
cout<<*ci<<endl;//迭代器如同指针一样,用*取出所指容器中的数据;
}
c.clear();//清空容器,以便下次输入;
}
return 0;
}
这就是迭代器的一个很小的应用吧!
这儿需要注意的是,c.end()这个迭代器是指向的容器中俄最后一个元素的下一个位置。
这儿就有容器中的一些方法:
c.begin();这个是返回一个迭代器,指向容器中的第一个元素;c代表容器;
c.end();这个是返回一个迭代器,它指向容器中的最后一个元素的下一个位置。
c.rbegin(0;返回一个逆序的迭代器,指向c中的最后一个元素。
c.push_back();在容器c的尾部添加值为t的元素,返回void,容器c的长度自加1;
c.push_front(t);在容器的前端添加t的元素,返回void.
c.size();返回容器中的元素,返回类型为c::size_type.
c.empty();判断容器是否为空,若为空,返回true,否则false。
c.erase(p);删除迭代器p所指的元素,返回一个迭代器,它指向被删除元素后面的元素。
c.erase(b,e);删除迭代器b和e所标记范围内的所有元素。返回指向删除元素的后一个元素的迭代器。
c.clear();清空容器;
c.pop_back();删除容器中的最后一个元素。返回void
c.pop_front();删除容器中的第一个元素。返回void;
c1.swap(c2);交换内容,调用完该函数后,c1中存放的就是c2中的原来的元素了,c2中存放的就是c1中的原来的元素。该函数的执行速度通常要比c2元素复制到c1的操作快。
c.assign(b,e);重新设置c中的元素,将迭代器b和e标记范围内的所有元素复制到c中。
assign()函数的操作首先就是删除容器中的所有元素,然后就是将参数指向的新元素插入到该容器中。如果二个容器的类型相同的话,其元素类型也相同的话,就可以使用赋值语句,如果是不同的容器,元素类型不同但是相互兼容的话,要赋值的话就必须使用assign函数。可以通过assign操作,实现将vector中的一段char*类型的元素赋值到string类型的list中。
swap()这个函数没有移动二个容器中的元素,所以,迭代器不是失效,这样就是原来c1.swap(c2),有一个迭代器p原来指向c1中的第二个元素,施行交换函数后,这个迭代器此时的指向元素不会变,只不过是变成了s2中的第二个元素。
这篇文章就算是自己的一次笔记吧!