什么是STL
STL就是Standard Template Library,标准模板库。STL是泛型编程的实例,用到的技术就是类模板和函数模板。STL的一个重要特点是数据结构和算法的分离。
模板:所谓模板是一种使用无类型参数来产生一系列函数或类的机制。通过模板可以产生类或函数的集合,使它们操作不同的数据类型,从而避免需要为每一种数据类型产生一个独立的类或函数。
STL简介
STL的代码从广义上讲分为3类:algorithm(算法)、container(容器)和iterator(迭代器)。几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用几乎。在C++标准中,STL由13个头文件组成,如<list>
STL的代码从广义上讲分为三类(共13个头文件)
算法(algorithm) 3个头文件 |
algorithm,numeric,functional |
容器(container) 7个头文件 |
vector,list,deque,stack,set(set,multiset),map(map,multimap),queue(queue,priority_queue) 共10个数据结构 |
迭代器(iterator) 3个头文件 |
iterator,memory,utility |
算法
算法是用来操作容器中的数据的模版函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象。函数本身与他们操作的数据的结构和类型无关,因此他们可以从简单的数组到高度复杂容器的任何数据结构上使用。
算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。<algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。<functional>中则定义了一些模板类,用以声明函数对象。
容器
容器是一种数据结构,如list,vector和deques,以模板类的方法提供。为了访问容器中的数据,可以使用容器类输出的迭代器。
数据结构 |
描述 |
头文件 |
vector向量 |
连续存储元素 |
<vector> |
list列表 |
由节点组成的双向链表,每个节点包含一个元素 |
<list> |
deque双列表 |
连续存储的指向不同元素的指针所组成数组 |
<deque> |
set集合 |
由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序 |
<set> |
multiset多重集合 |
允许存在两个次序相等的元素的集合 |
<set> |
stack栈 |
后进先出的值的排列 |
<stack> |
queue队列 |
先进先出的执的排列 |
<queue> |
priority_queue优先队列 |
元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列 |
<queue> |
map映射 |
由{键,值}对组成的集合,以某种作用于键对上的谓词排列 |
<map> |
multimap多重映射 |
允许键对有相等的次序的映射 |
<map> |
对应的数据结构:vector线性表,list双向链表,stack栈,queue队列,deque可以理解为vector和list的结合体,set红黑树,map平衡二叉树
容器分为三大类
顺序容器 |
vector:后部插入/删除,直接访问 deque:前/后部插入/删除,直接访问 list:双向链表,任意位置插入/删除 |
关联容器 |
set:快速查找,无重复元素 multiset:快速查找,可有重复元素 map:一对一映射,无重复元素,基于关键字查找 multimap:一对一映射,可有重复元素,基于关键之查找 |
容器适配器 |
stack:LIFO queue:FIFO priority_queue:优先级高的元素先出 |
迭代器
迭代器提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象。
软件设计有一个基本原则,所有的问题都可以通过引进一个间接层来简化,这种简化在STL中就是用迭代器来完成的。概括来说,迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。
迭代器部分主要由头文件<utility>,<iterator>和<memory>组成。
<utility>是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明,
<iterator>中提供了迭代器使用的许多方法,
而对于<memory>的描述则十分的困难,它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制,<memory>中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。
容器
同一种类型对象的集合。这些容器的共有成员函数:empty()判断容器中是否有元素,max_size()容器中最多能装多少元素,swap()交换两个容器的内容。
比较两个容器大小的运算符:=,<,<=,>,>=,==,!=
- 1.若两容器长度相同、所有元素相等,则两个容器就相等,否则为不等。
- 2.若两容器长度不同,但较短容器中所有元素都等于较长容器中对应的元素,则较短容器小于另一个容器。
- 3.若两个容器均不是对方的子序列,则取决于所比较的第一个不等的元素)
线性表
在实际应用中,线性表都是以字符串string,数组array,栈stack,队列queue,优先队列priority_queue,向量vector,列表list,双向队列deque等特殊线性表的形式来使用的。根据存储方式可分为顺序表,链表;链表又分为单链表,双链表,循环链表。
顺序容器(vector,list,deque)
元素排列次序与元素值无关,而是由元素添加到容器里的顺序决定的。
- 1.定义赋值,它们的定义赋值assign及用法完全相同。
- 2.都有返回表头元素表尾元素front(),back(),对于双向链表list和双向队列deque来说也只有一个表头和一个表尾,这里的双向是对元素可以双向添加删除而言的。
- 3.增加删除元素,都提供了在表尾增加删除元素方法push_back(),pop_back(),在任意位置增加删除元素方法insert(),erase(),全部删除元素clear()。
- 4.返回iterator和reverse_iterator 返回指向表头元素的指针begin(),返回表尾元素下一个位置end(),返回指向表尾元素的指针rbegin(),返回表头元素前一个位置rend()。
- 5.其他 获取长度size(),重置长度resize(),返回最大长度max_size(),两个容器互换swap(),判断是否为空empty()
vector
向量vector就是动态数组。顺序存储(说明可以用索引值,at()来进行元素访问,且其iterator可以+-n),连续存储元素。比list和deque多提供了获取容量capacity(),设置最小容量reserve()
list
列表list是一个双向链表。链式存储(不可以用索引值来进行访问,且其iterator不可以+-n),由节点组成的双向链表,每个节点包含着一个元素。由于是双向链表,所以比vector多提供了在表头增加删除函数push_front(),pop_front(),此外比vector和deque多提供了排序函数sort(),队列合并merge()(注意:合并前需要排序),接合函数splice(),去重函数unique(),删除元素函数remove(),remove_if()
deque
双向队列deque。顺序存储(说明可以用索引值,at()来进行元素访问,且其iterator可以+-n),连续存储指向不同元素的指针所组成的数组。由于是双向队列,所以比vector多提供了在表头增加删除函数push_front(),pop_front(),此外比vector少提供了逆序函数reverse()
选择容器类型的法则
如果程序要求随机访问元素,则应使用 vector 或 deque 容器。
如果程序必须在容器的中间位置插入或删除元素,则应采用 list 容器。
如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则应采用 deque 容器。
如果只需在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑在输入时将元素读入到一个 list 容器,接着对此容器重新排序,使其适合顺序访问,然后将排序后的 list 容器复制到一个 vector 容器。
关联容器,通过 键 存储和读取元素。顺序容器,通过元素在容器中的位置顺序存储和读取元素。
关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。
map映射
map是标准关联式容器之一,一个map是一个键值对序列,即(key,value)对。它提供了基于key的快速检索能力,在一个map中key值是唯一的。map提供了双向迭代器,即从前往后的(iterator),也有从后往前的(reverse_iterator)。
map要求能对key进行操作,且保持按key值递增有序,因此map上的迭代器也是递增有序的。如果对于元素并不需要保持有序,可以使用hash_map。
map中key值是唯一的,如果map中已存在一个键值对(昵称,密码):("sky",789852),而我们还是想插入一个键值对("sky",789852)则会报错(不是报错,准确的说是,返回插入不成功!)。而我们有的确想这样做,即一个键对于多个值,幸运的是multimap可以实现这个功能。
小demo
网上实例
[cpp] view plain copy print ?
- #include <string>
- #include <map>
- #include <conio.h>
- #include<iostream>
- using namespace std;
-
- void test0()
- {
- map<int,string> first;
- first.insert(pair<int,string>(3,"hello"));
- map<int,string> second(first);
- map<int,string> third(first.begin(),first.end());
- }
-
- void test1()
- {
-
- map<char,int> myfirst;
- myfirst.insert(pair<char,int>('a',100));
-
- myfirst.insert(map<char,int>::value_type('f',50));
-
- myfirst['w']=60;
-
- map<char,int>::iterator ite=myfirst.begin();
- myfirst.insert(ite,pair<char,int>('b',300));
-
- cout<<"myfirst\n";
- for (map<char,int>::iterator iter=myfirst.begin();iter!=myfirst.end();iter++)
- {
- cout<<iter->first<<"=>"<<iter->second<<endl;
-
-
-
-
- }
- map<int,int>mymap;
- for (int i=0;i<3;i++)
- {
- mymap[i]=i*100;
- }
- for (map<int,int>::iterator iter=mymap.begin();iter!=mymap.end();iter++)
- {
- cout<<iter->first<<"=>"<<iter->second<<endl;
-
-
-
- }
- mymap.clear();
- mymap[8]=20;
- mymap[5]=60;
- while(!mymap.empty())
- {
- cout<<mymap.begin()->first<<"=>"<<mymap.begin()->second<<endl;
-
-
- mymap.erase(mymap.begin());
- }
- map<char,int> first;
- map<char,int>::iterator it;
- first['a']=10;
- first['b']=20;
- first['c']=30;
- first['d']=40;
- first['e']=50;
- first['f']=60;
- first['g']=70;
- first['h']=80;
-
- it=first.find('b');
- first.erase(it);
- first.erase('c');
- it=first.find('e');
- first.erase(it,first.end());
- cout<<"--------------erase-------------\n";
- for (it=first.begin();it!=first.end();it++)
- {
- cout<<it->first<<"=>"<<it->second<<endl;
-
-
- }
- }
-
- void test2()
- {
- map<char,int> first;
- map<char,int>::iterator it;
- first['a']=10;
- first['b']=20;
- first['c']=30;
- first['d']=40;
- it=first.find('b');
- first.erase(it);
- first.erase(first.find('d'));
- cout<<"a=>"<<first.begin()->second<<endl;
- cout<<"c=>"<<first.find('c')->second<<endl;
-
-
- }
-
- void test3()
- {
- map<char,int> mymap;
- mymap['b']=100;
- mymap['a']=200;
- mymap['c']=500;
- map<char,int>::iterator iter=mymap.begin();
- for (;iter!=mymap.end();iter++)
- {
- cout<<iter->first<<"=>"<<iter->second<<endl;
-
-
-
- }
- cout<<"----reverse_iterator----"<<endl;
- map<char,int>::reverse_iterator riter=mymap.rbegin();
- for (;riter!=mymap.rend();++riter)
- {
- cout<<riter->first<<"=>"<<riter->second<<endl;
-
-
-
- }
-
- }
-
- void test4()
- {
- map<char,int>mymap,second;
- mymap['a']=101;
- mymap['b']=202;
- mymap['c']=303;
- mymap['d']=404;
- for (char c='a';c<'h';c++)
- {
- cout<<c;
- if (mymap.count(c)>0)
- {
- cout<<" is an element of mymap.\n";
- }
- else
- cout<<" is not an element of mymap.\n";
- }
- cout<<"mymap.size() is "<<mymap.size()<<endl;
-
- second['x']=11;
- second['y']=22;
- second['z']=33;
- second.swap(mymap);
-
- cout<<"mymap-----\n";
- for (map<char,int>::iterator it=mymap.begin();it!=mymap.end();it++)
- {
- cout<<it->first<<"=>"<<it->second<<endl;
-
-
-
- }
- cout<<"second-----\n";
- for (map<char,int>::iterator it=second.begin();it!=second.end();it++)
- {
- cout<<it->first<<"=>"<<it->second<<endl;
-
-
-
-
- }
-
- pair<map<char,int>::iterator,map<char,int>::iterator> ret=mymap.equal_range('y');
- cout<<"lower bound points to: "<<ret.first->first<<"=>"<<ret.first->second<<endl;
- cout<<"upper bound points to: "<<ret.second->first<<"=>"<<ret.second->second<<endl;
-
- map<char,int>::iterator itlow,itup;
-
-
- itlow=second.lower_bound('b');
- itup=second.upper_bound('c');
- second.erase(itlow,itup);
- cout<<"itlow,itup\n";
- for (map<char,int>::iterator it=second.begin();it!=second.end();it++)
- {
- cout<<it->first<<"=>"<<it->second<<endl;
-
-
- }
- second['p']=505;
- map<char,int>::key_compare mycomp=second.key_comp();
- char highest=second.rbegin()->first;
- map<char,int>::iterator item=second.begin();
- cout<<"key_compare\n";
- do
- {
- cout<<item->first<<"=>"<<item->second<<endl;
- }while(mycomp((*item++).first,highest));
-
- cout<<"value_compare\n";
- pair<char,int> high=*second.rbegin();
- map<char,int>::iterator io=second.begin();
- do
- {
- cout<<io->first<<"=>"<<io->second<<endl;
- } while (second.value_comp()(*io++,high));
-
- }
-
- void test5()
- {
-
-
-
- map<int,int> mymap;
- mymap[0]=100;
- mymap[3]=200;
- mymap[2]=500;
- map<int,int>::iterator iter=mymap.begin();
- for (;iter!=mymap.end();iter++)
- {
- cout<<iter->first<<"=>"<<iter->second<<endl;
-
-
-
- }
- cout<<"----reverse_iterator----"<<endl;
- map<int,int>::reverse_iterator riter=mymap.rbegin();
- for (;riter!=mymap.rend();++riter)
- {
- cout<<riter->first<<"=>"<<riter->second<<endl;
-
-
-
- }
- cout<<"mymap size:"<<mymap.size()<<endl;
- for (int i=0;i<mymap.size();i++)
- {
- cout<<mymap[i]<<endl;
-
-
-
-
-
- }
- }
- void Test(char h)
- {
- cout<<"press key===="<<h<<endl;
- switch(h)
- {
- case '0': test0();break;
- case '1': test1();break;
- case '2': test2();break;
- case '3': test3();break;
- case '4': test4();break;
- case '5': test5();break;
- case 27:
- case 'q':exit(0);break;
- default:cout<<"default "<<h<<endl;break;
- }
- }
- void main()
- {
- while(1)
- {
- Test(getch());
- }
- }
#include <string>
#include <map>
#include <conio.h>
#include<iostream>
using namespace std;
//定义及初始化;没有返回值,或void
void test0()
{
map<int,string> first;
first.insert(pair<int,string>(3,"hello"));
map<int,string> second(first);//拷贝构造函数
map<int,string> third(first.begin(),first.end());//区间构造函数
}
//增加删除元素;返回值是void,除erase()的返回值是iterator外
void test1()
{
//first insert 用insert()函数插入pair数据
map<char,int> myfirst;
myfirst.insert(pair<char,int>('a',100));
//second insert 用insert()函数插入value_type数据
myfirst.insert(map<char,int>::value_type('f',50));
//third insert 使用数组方式插入数据
myfirst['w']=60;
//fourth insert 在iterator位置上插入pair数据
map<char,int>::iterator ite=myfirst.begin();
myfirst.insert(ite,pair<char,int>('b',300));
cout<<"myfirst\n";
for (map<char,int>::iterator iter=myfirst.begin();iter!=myfirst.end();iter++)
{
cout<<iter->first<<"=>"<<iter->second<<endl;
//a=>100
//b=>300
//f=>50
//w=>60
}
map<int,int>mymap;
for (int i=0;i<3;i++)
{
mymap[i]=i*100;
}
for (map<int,int>::iterator iter=mymap.begin();iter!=mymap.end();iter++)
{
cout<<iter->first<<"=>"<<iter->second<<endl;
//0=>0
//1=>100
//2=>200
}
mymap.clear();
mymap[8]=20;
mymap[5]=60;
while(!mymap.empty())
{
cout<<mymap.begin()->first<<"=>"<<mymap.begin()->second<<endl;
//5=>60
//8=>20
mymap.erase(mymap.begin());
}
map<char,int> first;
map<char,int>::iterator it;
first['a']=10;
first['b']=20;
first['c']=30;
first['d']=40;
first['e']=50;
first['f']=60;
first['g']=70;
first['h']=80;
it=first.find('b');
first.erase(it); //用迭代器删除
first.erase('c');//用关键字删除
it=first.find('e');
first.erase(it,first.end());//成片删除
cout<<"--------------erase-------------\n";
for (it=first.begin();it!=first.end();it++)
{
cout<<it->first<<"=>"<<it->second<<endl;
//a=>10
//b=>40
}
}
//访问获取元素;返回值是Type T
void test2()
{
map<char,int> first;
map<char,int>::iterator it;
first['a']=10;
first['b']=20;
first['c']=30;
first['d']=40;
it=first.find('b');
first.erase(it);
first.erase(first.find('d'));
cout<<"a=>"<<first.begin()->second<<endl;//a=>10
cout<<"c=>"<<first.find('c')->second<<endl;//c=>30
//cout<<"w=>"<<first.find('w')->second<<endl;//当关键字不存在时,运行出现错误
}
//返回迭代器;返回值是iterator,或reverse_iterator
void test3()
{
map<char,int> mymap;
mymap['b']=100;
mymap['a']=200;
mymap['c']=500;
map<char,int>::iterator iter=mymap.begin();
for (;iter!=mymap.end();iter++)
{
cout<<iter->first<<"=>"<<iter->second<<endl;
//a=>200
//b=>100
//c=>500
}
cout<<"----reverse_iterator----"<<endl;
map<char,int>::reverse_iterator riter=mymap.rbegin();
for (;riter!=mymap.rend();++riter)
{
cout<<riter->first<<"=>"<<riter->second<<endl;
//c=>500
//b=>100
//a=>200
}
}
//其他
void test4()
{
map<char,int>mymap,second;
mymap['a']=101;
mymap['b']=202;
mymap['c']=303;
mymap['d']=404;
for (char c='a';c<'h';c++)
{
cout<<c;
if (mymap.count(c)>0)
{
cout<<" is an element of mymap.\n";//a,b,c,d
}
else
cout<<" is not an element of mymap.\n";//d,e,f,g
}
cout<<"mymap.size() is "<<mymap.size()<<endl;//3
second['x']=11;
second['y']=22;
second['z']=33;
second.swap(mymap);
cout<<"mymap-----\n";
for (map<char,int>::iterator it=mymap.begin();it!=mymap.end();it++)
{
cout<<it->first<<"=>"<<it->second<<endl;
//x=>11
//y=>22
//z=>33
}
cout<<"second-----\n";
for (map<char,int>::iterator it=second.begin();it!=second.end();it++)
{
cout<<it->first<<"=>"<<it->second<<endl;
//a=>101
//b=>202
//c=>303
//d=>404
}
//equal_range():返回pair(iterator,iterator),pair中的第一个迭代器是lower_bound()返回的迭代器,pair中的第二个迭代器是upper_bound()返回的迭代器,如果两个迭代器相等,则说明map中不存在这个关键字
pair<map<char,int>::iterator,map<char,int>::iterator> ret=mymap.equal_range('y');
cout<<"lower bound points to: "<<ret.first->first<<"=>"<<ret.first->second<<endl;//y=>22
cout<<"upper bound points to: "<<ret.second->first<<"=>"<<ret.second->second<<endl;//z=>33
map<char,int>::iterator itlow,itup;
//lower_bound():返回是iterator,返回要查找关键字的下界(是一个迭代器)
//upper_bound():返回是iterator,返回要查找关键字的上界(是一个迭代器)
itlow=second.lower_bound('b');//itlow points to b
itup=second.upper_bound('c');//itup points to d (not c)
second.erase(itlow,itup);//删除[itlow,itup)
cout<<"itlow,itup\n";
for (map<char,int>::iterator it=second.begin();it!=second.end();it++)
{
cout<<it->first<<"=>"<<it->second<<endl;
//a=>101
//d=>404
}
second['p']=505;
map<char,int>::key_compare mycomp=second.key_comp();
char highest=second.rbegin()->first;
map<char,int>::iterator item=second.begin();
cout<<"key_compare\n";
do
{
cout<<item->first<<"=>"<<item->second<<endl;
}while(mycomp((*item++).first,highest));
cout<<"value_compare\n";
pair<char,int> high=*second.rbegin();
map<char,int>::iterator io=second.begin();
do
{
cout<<io->first<<"=>"<<io->second<<endl;
} while (second.value_comp()(*io++,high));
}
//遍历map中的数据
void test5()
{
//1.使用前向迭代器
//2.使用相反迭代器
//3.使用数组(不完全正确,当数据插入时键值完全顺序才正确,不然会出现二叉树的输出结果)
map<int,int> mymap;
mymap[0]=100;
mymap[3]=200;
mymap[2]=500;
map<int,int>::iterator iter=mymap.begin();
for (;iter!=mymap.end();iter++)
{
cout<<iter->first<<"=>"<<iter->second<<endl;
//0=>100
//2=>500
//3=>200
}
cout<<"----reverse_iterator----"<<endl;
map<int,int>::reverse_iterator riter=mymap.rbegin();
for (;riter!=mymap.rend();++riter)
{
cout<<riter->first<<"=>"<<riter->second<<endl;
//3=>200
//2=>500
//0=>100
}
cout<<"mymap size:"<<mymap.size()<<endl;
for (int i=0;i<mymap.size();i++)
{
cout<<mymap[i]<<endl;
//100
//0
//500
//200
//map中由于他内部有序,由红黑树保证,因此很多函数执行的时间复杂度都是log2N
}
}
void Test(char h)
{
cout<<"press key===="<<h<<endl;
switch(h)
{
case '0': test0();break;
case '1': test1();break;
case '2': test2();break;
case '3': test3();break;
case '4': test4();break;
case '5': test5();break;
case 27:
case 'q':exit(0);break;
default:cout<<"default "<<h<<endl;break;
}
}
void main()
{
while(1)
{
Test(getch());
}
}
map是一类关联容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他节点都没有什么影响。因为它内部结构式红黑二叉树。对于迭代器来说可以修改实值value,而不能修改关键字key。map的功能如下:
- 自动建立key-value的对应。key和value可以使任意你需要的类型。
- 根据key值快速查找记录,查找的复杂度基本是log(N)
- 快速插入key-value记录
- 快速删除记录
- 根据key修改value记录
- 遍历所有记录
Vector 网上教程有实例的
vector的函数共有五大类:定义及初始化,增加删除元素,访问元素,返回迭代器,获取设置长度容器
[cpp] view plain copy print ?
- #include <string>
- #include <vector>
- #include <conio.h>
- #include<iostream>
- using namespace std;
-
- void test0()
- {
- vector<int> v;
- vector<int> ve(2);
- vector<int> vec(3,4);
- cout<<v.size()<<" "<<ve.size()<<" "<<vec.size()<<endl;
- cout<<"ve:"<<ve[0]<<" "<<ve[1]<<endl;
- cout<<"vec:"<<vec[0]<<" "<<vec[1]<<" "<<vec[2]<<endl;
- v.assign(3,8);
- ve.assign(vec.begin(),vec.end());
- for (int i=0;i<v.size();i++)
- cout<<v[i]<<" ";
- cout<<endl;
- for (int i=0;i<ve.size();i++)
- cout<<ve[i]<<" ";
- cout<<endl;
- ve.assign(0,0);
- for (int i=0;i<ve.size();i++)
- cout<<ve[i]<<" ";
- cout<<endl;
- }
-
- void test1()
- {
- vector<char> v(2,'A');
- v.push_back('B');
- cout<<v[0]<<" "<<v[1]<<' '<<v[2]<<endl;
- v.pop_back();
- v.insert(v.begin()+1,'C');
- v.insert(v.begin(),2,'D');
- v.insert(v.end(),v.begin(),v.end());
- for (int i=0;i<v.size();i++)
- cout<<v[i]<<" ";
- cout<<endl;
-
- v.erase(v.begin());
- for (int i=0;i<v.size();i++)
- cout<<v[i]<<" ";
- cout<<endl;
- v.erase(v.begin()+1,v.end()-1);
- for (int i=0;i<v.size();i++)
- cout<<v[i]<<" ";
- cout<<endl;
- v.clear();
- for (int i=0;i<v.size();i++)
- cout<<v[i]<<" ";
- cout<<endl;
- }
-
- void test2()
- {
- string str[]={"one","two","three","four","five","six"};
- vector<string> ve;
- for(int i=0;i<6;i++)
- {
- ve.push_back(str[i]);
- cout<<ve[i]<<" ";
- }
- cout<<endl;
- for(int i=0;i<6;i++)
- {
- cout<<ve.at(i)<<" ";
- }
- cout<<endl;
- cout<<ve.front()<<endl;
- cout<<ve.back()<<endl;
- }
-
- void test3()
- {
- vector<int>ve(4);
- ve[0]=0;ve[1]=1;ve[2]=2;ve[3]=3;
- cout<<ve[0]<<" "<<ve[1]<<" "<<ve[2]<<" "<<ve[3]<<endl;
- vector<int>::iterator iter;
- iter=ve.begin();
- cout<<*iter<<endl;
- iter=ve.end();
-
- cout<<*(iter-1)<<endl;
- vector<int>::reverse_iterator reIter;
- reIter=ve.rbegin();
- cout<<*reIter<<endl;
- reIter=ve.rend();
- cout<<*(reIter-1)<<endl;
- }
-
- void test4()
- {
- vector<string> ve(8);
- cout<<ve.size()<<endl;
- cout<<ve.max_size()<<endl;
- cout<<ve.capacity()<<endl;
- cout<<ve.empty()<<endl;
-
- ve.assign(12,"3");
- cout<<ve.size()<<endl;
- cout<<ve.max_size()<<endl;
- cout<<ve.capacity()<<endl;
- cout<<ve.empty()<<endl;
-
- ve.assign(1,"003");
- cout<<ve.size()<<endl;
- cout<<ve.max_size()<<endl;
- cout<<ve.capacity()<<endl;
- cout<<ve.empty()<<endl;
-
- ve.resize(15,"W");
- cout<<ve.size()<<endl;
- cout<<ve.max_size()<<endl;
- cout<<ve.capacity()<<endl;
- cout<<ve.empty()<<endl;
-
- ve.reserve(5);
- cout<<ve.size()<<endl;
- cout<<ve.max_size()<<endl;
- cout<<ve.capacity()<<endl;
- cout<<ve.empty()<<endl;
-
- vector<int> v(2,4);
- vector<int>vec(5,9);
- vec.swap(v);
- cout<<v.size()<<" "<<v[0]<<endl;
- cout<<vec.size()<<" "<<vec[0]<<endl;
-
- }
-
- void test5()
- {
- vector<int> vec;
- for (int i=0;i<10;i++)
- {
- vec.push_back(i);
- }
- for (int i=0;i<vec.size();i++)
- cout<<vec[i]<<" ";
- cout<<endl;
-
- vector<int>::iterator iter;
- for (iter=vec.begin();iter!=vec.end();iter++)
- cout<<*iter<<" ";
- cout<<endl;
-
- vector<int>::reverse_iterator reIter;
- for (reIter=vec.rbegin();reIter!=vec.rend();reIter++)
- cout<<*reIter<<" ";
- cout<<endl;
-
- vector<int>::reverse_iterator revIter;
- for (revIter=vec.rend()-1;revIter!=vec.rbegin();revIter--)
- cout<<*revIter<<" ";
- cout<<endl;
- }
- void Test(char h)
- {
- cout<<"press key===="<<h<<endl;
- switch(h)
- {
- case '0': test0();break;
- case '1': test1();break;
- case '2': test2();break;
- case '3': test3();break;
- case '4': test4();break;
- case '5': test5();break;
- case 27:
- case 'q':exit(0);break;
- default:cout<<"default "<<h<<endl;break;
- }
- }
- void main()
- {
- while(1)
- {
- Test(getch());
- }
- }
#include <string>
#include <vector>
#include <conio.h>
#include<iostream>
using namespace std;
//定义及初始化;返回void或无返回值
void test0()
{
vector<int> v;//只定义了v,没有分配内存空间
vector<int> ve(2);//定义并分配了2int空间的ve,缺省为0
vector<int> vec(3,4);//定义并初始化了3个4的vec
cout<<v.size()<<" "<<ve.size()<<" "<<vec.size()<<endl;//0 2 3
cout<<"ve:"<<ve[0]<<" "<<ve[1]<<endl;//ve: 0 0
cout<<"vec:"<<vec[0]<<" "<<vec[1]<<" "<<vec[2]<<endl;//vec: 4 4 4
v.assign(3,8);//赋值3个8
ve.assign(vec.begin(),vec.end());//赋值3个4
for (int i=0;i<v.size();i++)
cout<<v[i]<<" "; //8 8 8
cout<<endl;
for (int i=0;i<ve.size();i++)
cout<<ve[i]<<" ";//4 4 4
cout<<endl;
ve.assign(0,0);//赋值0个0,且可以看出它的内存是变化的.此为空
for (int i=0;i<ve.size();i++)
cout<<ve[i]<<" ";//为空
cout<<endl;
}
//增加删除元素;返回void,处erase()返回iterator外
void test1()
{
vector<char> v(2,'A');
v.push_back('B');//在尾部加入一个数据
cout<<v[0]<<" "<<v[1]<<' '<<v[2]<<endl;//A A B
v.pop_back();//删除最后一个数据
v.insert(v.begin()+1,'C');//在第二个位置上插入了'C'
v.insert(v.begin(),2,'D'); //在第一个第二个位置上分别插入'C'
v.insert(v.end(),v.begin(),v.end());//在其末端插入了其之前的所有元素,等于复制了
for (int i=0;i<v.size();i++)
cout<<v[i]<<" "; //D D A C A D D A C A
cout<<endl;
v.erase(v.begin());//删除第一个元素
for (int i=0;i<v.size();i++)
cout<<v[i]<<" "; //D A C A D D A C A
cout<<endl;
v.erase(v.begin()+1,v.end()-1);//留下两端的元素,删除中间的元素
for (int i=0;i<v.size();i++)
cout<<v[i]<<" "; //D A
cout<<endl;
v.clear();//删除全部
for (int i=0;i<v.size();i++)
cout<<v[i]<<" "; //为空
cout<<endl;
}
//访问获取元素;返回TYPE &T
void test2()
{
string str[]={"one","two","three","four","five","six"};
vector<string> ve;
for(int i=0;i<6;i++)
{
ve.push_back(str[i]);
cout<<ve[i]<<" ";//通过索引值i来进行访问,使用的是数组的形式,当然不能越界
}
cout<<endl;
for(int i=0;i<6;i++)
{
cout<<ve.at(i)<<" ";//使用at()通过i来进行访问,也不能越界。若越界,在调试时,会抛出异常;在运行时直接弹出错误
}
cout<<endl;
cout<<ve.front()<<endl;//one //返回第一个元素的引用
cout<<ve.back()<<endl;//six //返回最后一个元素的引用
}
//迭代器;返回iterator,或reverse_iterator
void test3()
{
vector<int>ve(4);
ve[0]=0;ve[1]=1;ve[2]=2;ve[3]=3;
cout<<ve[0]<<" "<<ve[1]<<" "<<ve[2]<<" "<<ve[3]<<endl;
vector<int>::iterator iter;//定义一个迭代器iter
iter=ve.begin();//返回一个iterator,它指向vector第一个元素
cout<<*iter<<endl;//0
iter=ve.end();//返回一个iterator,它指向vector最末尾元素的下一个位置(它不是末尾元素)
//cout<<*iter<<endl;//会出现错误
cout<<*(iter-1)<<endl;//3 用此方法访问末尾元素
vector<int>::reverse_iterator reIter;//定义一个反向的迭代器
reIter=ve.rbegin();//返回一个方向iterator,它指向vector末尾元素
cout<<*reIter<<endl;//3
reIter=ve.rend();//返回一个方向iterator,它指向vector第一个元素之前的位置(它是不存在的)
cout<<*(reIter-1)<<endl;//0 用此方法访问第一个元素
}
//取得、设置长度、容量;返回void或size_type
void test4()
{
vector<string> ve(8);
cout<<ve.size()<<endl;//8
cout<<ve.max_size()<<endl;//134217727,10737441823
cout<<ve.capacity()<<endl;//8
cout<<ve.empty()<<endl;//0,说明不为空,因为默认值是0
ve.assign(12,"3");
cout<<ve.size()<<endl;//12
cout<<ve.max_size()<<endl;//134217727(string),10737441823(int)
cout<<ve.capacity()<<endl;//12
cout<<ve.empty()<<endl;//0
ve.assign(1,"003");
cout<<ve.size()<<endl;//1 返回vector当前持有元素的个数
cout<<ve.max_size()<<endl;//他的最大个数与数据类型有关
cout<<ve.capacity()<<endl;//12 容量 取得vector目前可容纳的最大元素个数。这个方法与存储配置有关,它通常只会增加,不会因为元素被删除而随之减少
cout<<ve.empty()<<endl;//0 为空时,返回true
ve.resize(15,"W");//改变vector目前持有元素的个数
cout<<ve.size()<<endl;//15
cout<<ve.max_size()<<endl;//134217727(string),10737441823(int)
cout<<ve.capacity()<<endl;//18
cout<<ve.empty()<<endl;//0
ve.reserve(5);//如有必要,可改变vector的容量大小(只会增加,减少不起作用)
cout<<ve.size()<<endl;//15
cout<<ve.max_size()<<endl;//134217727(string),10737441823(int)
cout<<ve.capacity()<<endl;//18 当ve.reserve(35);则输出35;则说明容量capacity只会增加不会减少
cout<<ve.empty()<<endl;//0
vector<int> v(2,4);
vector<int>vec(5,9);
vec.swap(v);//两个vector进行交换
cout<<v.size()<<" "<<v[0]<<endl;//5 9
cout<<vec.size()<<" "<<vec[0]<<endl;//2 4
}
//遍历vector
void test5()
{
vector<int> vec;
for (int i=0;i<10;i++)
{
vec.push_back(i);
}
for (int i=0;i<vec.size();i++)
cout<<vec[i]<<" ";
cout<<endl;
vector<int>::iterator iter;
for (iter=vec.begin();iter!=vec.end();iter++)
cout<<*iter<<" ";
cout<<endl;
vector<int>::reverse_iterator reIter;
for (reIter=vec.rbegin();reIter!=vec.rend();reIter++)
cout<<*reIter<<" ";//9 8 7 6 5 4 3 2 1 0
cout<<endl;
vector<int>::reverse_iterator revIter;
for (revIter=vec.rend()-1;revIter!=vec.rbegin();revIter--)
cout<<*revIter<<" ";//0 1 2 3 4 5 6 7 8 //有点残缺
cout<<endl;
}
void Test(char h)
{
cout<<"press key===="<<h<<endl;
switch(h)
{
case '0': test0();break;
case '1': test1();break;
case '2': test2();break;
case '3': test3();break;
case '4': test4();break;
case '5': test5();break;
case 27:
case 'q':exit(0);break;
default:cout<<"default "<<h<<endl;break;
}
}
void main()
{
while(1)
{
Test(getch());
}
}
list网上实例
list的函数共有五大类:定义及初始化,增加删除元素,访问元素,返回迭代器,其他
[cpp] view plain copy print ?
- #include <string>
- #include <vector>
- #include <list>
- #include <conio.h>
- #include<iostream>
- using namespace std;
- void PrintListInt(list<int>& param)
- {
- for (list<int>::iterator iter=param.begin();iter!=param.end();iter++)
- {
- cout<<*iter<<" ";
- }
- cout<<endl;
- }
- void PrintListString(list<string>& param)
- {
- for (list<string>::iterator iter=param.begin();iter!=param.end();iter++)
- {
- cout<<*iter<<" ";
- }
- cout<<endl;
- }
-
- void test0()
- {
- list<int> first(4);
- PrintListInt(first);
- list<int> second(3,88);
- PrintListInt(second);
- first.assign(4,90);
- second.assign(first.begin(),first.end());
- int arr[]={23,45,56};
- second.assign(arr,arr+2);
- PrintListInt(second);
- second.assign(0,0);
- PrintListInt(second);
- }
-
- void test1()
- {
- list<int> first(3,8);
- first.push_back(6);
- first.push_front(2);
- PrintListInt(first);
- first.pop_back();
- first.pop_front();
- PrintListInt(first);
- first.insert(first.begin(),5);
- first.insert(first.end(),2,9);
- PrintListInt(first);
- list<int>second;
- second.insert(second.end(),first.begin(),first.end());
- PrintListInt(second);
-
- second.erase(second.begin());
- PrintListInt(second);
- second.erase(second.begin(),second.end());
- PrintListInt(second);
-
- first.remove(77);
- PrintListInt(first);
- first.remove(8);
- PrintListInt(first);
- if (!first.empty())
- first.clear();
- PrintListInt(first);
-
-
- }
-
- void test2()
- {
- list<int> first;
- for(int i=0;i<5;i++)
- first.push_back(i);
- cout<<first.front()<<endl;
- cout<<first.back()<<endl;
-
- }
-
- void test3()
- {
- list<int> first;
- for(int i=0;i<5;i++)
- first.push_back(i);
- cout<<*first.begin()<<endl;
- cout<<*first.rbegin()<<endl;
- for(list<int>::iterator it=first.begin();it!=first.end();it++)
- cout<<*it<<" ";
- cout<<endl;
- list<int>::reverse_iterator reIt=first.rbegin();
- while(reIt!=first.rend())
- {
- cout<<*reIt<<" ";
- reIt++;
- }
- cout<<endl;
-
- }
-
- void test4()
- {
- list<string> ve(2);
- cout<<ve.size()<<endl;
- cout<<ve.max_size()<<endl;
- ve.resize(7);
- cout<<ve.size()<<endl;
-
-
- list<int> first;
- for(int i=0;i<5;i++)
- first.push_back(i);
- first.reverse();
- PrintListInt(first);
- list<int>second(2,9);
- second.swap(first);
- PrintListInt(first);
- PrintListInt(second);
- first.sort();
- second.sort();
- PrintListInt(second);
- first.merge(second);
- PrintListInt(first);
- PrintListInt(second);
- first.unique();
- PrintListInt(first);
-
-
- list<int> one,two;
- for(int i=0;i<4;i++)
- {
- one.push_back(i*5);
- two.push_back(i*10);
- }
- one.splice(one.begin(),two);
- PrintListInt(one);
- PrintListInt(two);
- two.assign(3,2);
- one.splice(one.begin(),two,two.begin());
- PrintListInt(one);
- PrintListInt(two);
- one.splice(one.end(),two,two.begin(),two.end());
- PrintListInt(two);
- PrintListInt(one);
- }
-
- void test5()
- {
- list<int> vec;
- for (int i=0;i<10;i++)
- {
- vec.push_back(i);
- }
-
- list<int>::iterator iter;
- for (iter=vec.begin();iter!=vec.end();iter++)
- cout<<*iter<<" ";
- cout<<endl;
-
- list<int>::reverse_iterator reIter;
- for (reIter=vec.rbegin();reIter!=vec.rend();reIter++)
- cout<<*reIter<<" ";
- cout<<endl;
-
- vec.reverse();
- list<int>::reverse_iterator reveIter=vec.rbegin();
- while(reveIter!=vec.rend())
- {
- cout<<*reveIter<<" ";
- reveIter++;
- }
- cout<<endl;
- }
- void Test(char h)
- {
- cout<<"press key===="<<h<<endl;
- switch(h)
- {
- case '0': test0();break;
- case '1': test1();break;
- case '2': test2();break;
- case '3': test3();break;
- case '4': test4();break;
- case '5': test5();break;
- case 27:
- case 'q':exit(0);break;
- default:cout<<"default "<<h<<endl;break;
- }
- }
- void main()
- {
- while(1)
- {
- Test(getch());
- }
- }</int>
#include <string>
#include <vector>
#include <list>
#include <conio.h>
#include<iostream>
using namespace std;
void PrintListInt(list<int>& param)
{
for (list<int>::iterator iter=param.begin();iter!=param.end();iter++)
{
cout<<*iter<<" ";
}
cout<<endl;
}
void PrintListString(list<string>& param)
{
for (list<string>::iterator iter=param.begin();iter!=param.end();iter++)
{
cout<<*iter<<" ";
}
cout<<endl;
}
//定义及初始化;没有返回值,或void
void test0()
{
list<int> first(4);//定义并初始化4个0
PrintListInt(first);//0 0 0 0
list<int> second(3,88);//定义并初始化3个88
PrintListInt(second);//88 88 88
first.assign(4,90);//assign赋值 //4个90
second.assign(first.begin(),first.end());//second拷贝first
int arr[]={23,45,56};
second.assign(arr,arr+2);
PrintListInt(second);//23 45 (没有56,者说明assign赋值是[begin,end),而不是[begin,end])
second.assign(0,0);//清空second
PrintListInt(second);//为空
}
//增加删除元素;返回值是void,除erase()的返回值是iterator外
void test1()
{
list<int> first(3,8);
first.push_back(6);//增加一个元素在list末端
first.push_front(2);//增加一个元素在list前端
PrintListInt(first);//2 8 8 8 6
first.pop_back();//删除list末端元素
first.pop_front();//删除list前端元素
PrintListInt(first);//8 8 8
first.insert(first.begin(),5);//在前端添加一个元素,不可以first.begin()+1;但vector<int>ve(4);ve.insert(ve.begin()+1,4);却可以
first.insert(first.end(),2,9);//在末端添加两个元素,同上,end()-2不可以,但vector的end()-2可以
PrintListInt(first);//5 8 8 8 9 9
list<int>second;
second.insert(second.end(),first.begin(),first.end());//second赋值first
PrintListInt(second);//5 8 8 8 9 9
second.erase(second.begin());//删除前端元素,参数不能为second.begin()+1,当然也不能为second.end();若要删除第二个元素,则可通过++second.begin(),或iterator,然后iterator++
PrintListInt(second);//8 8 8 9 9
second.erase(second.begin(),second.end());//全部删除
PrintListInt(second);//为空
first.remove(77);//删除77这个不存在的元素
PrintListInt(first);//5 8 8 8 9 9
first.remove(8);//删除所有的8这个元素
PrintListInt(first);//5 9 9
if (!first.empty())
first.clear();//全部清除
PrintListInt(first);//为空
//在list的函数insert(),erase()的函数参数时(iterator+2)是不可以的,只可以通过不停地iterator++;这一点与vector的insert(),erase()不同,可以通过iterator+2来很方便的删除任意位置的元素。因为它们存储的内存地址不一定连续的,所以不能通过iterator+、-N来访问第N个元素,只能通过iterator++来逐一访问,甚至量iterator=iterator+1都不行
//由于list是双向链表,所以比线性表vector多提供了增加删除元素的函数,push_front(),pop_front(),remove(),remove_if()
}
//访问获取元素;返回值是Type T
void test2()
{
list<int> first;
for(int i=0;i<5;i++)
first.push_back(i);
cout<<first.front()<<endl;//0 返回前端元素的引用
cout<<first.back()<<endl;//4 返回末端元素的引用
//由于list是双向链表,所有没有像线性表vector那样提供下标索引,at()来提供方便的数据访问函数
}
//返回迭代器;返回值是iterator,或reverse_iterator
void test3()
{
list<int> first;
for(int i=0;i<5;i++)
first.push_back(i);
cout<<*first.begin()<<endl;//0 不可以 cout<<*first.end()<<endl;不然会崩溃
cout<<*first.rbegin()<<endl;//4 不可以cout<<*first.rend()<<endl;不然会崩溃
for(list<int>::iterator it=first.begin();it!=first.end();it++)
cout<<*it<<" ";//0 1 2 3 4
cout<<endl;
list<int>::reverse_iterator reIt=first.rbegin();
while(reIt!=first.rend())
{
cout<<*reIt<<" ";//4 3 2 1 0
reIt++;//记住是++,因为他是rbegin中的begin
}
cout<<endl;
//与vector提供的函数相同begin(),end(),rbegin(),rend();不同的iterator不可以+N
}
//其他
void test4()
{
list<string> ve(2);
cout<<ve.size()<<endl;//2
cout<<ve.max_size()<<endl;//134217727(string),10737441823(int)
ve.resize(7);
cout<<ve.size()<<endl;//7
//与vector不同的是少了capacity(),reserve()获取容量,设置容量
list<int> first;
for(int i=0;i<5;i++)
first.push_back(i);
first.reverse();//逆序
PrintListInt(first);//4 3 2 1 0
list<int>second(2,9);
second.swap(first);//两个list之间交互数据
PrintListInt(first);//9 9
PrintListInt(second);// 4 3 2 1 0
first.sort();
second.sort();//排序(从小到大)
PrintListInt(second);//0 1 2 3 4
first.merge(second);//second合并到first中,之后second为空。这里需要注意的是:在调用合并函数merge()之前,first和second都必须是从小到大的排序的
PrintListInt(first);//0 1 2 3 4 9 9
PrintListInt(second);//为空
first.unique();//使唯一,删除相同的数据
PrintListInt(first);//0 1 2 3 4 9
//比vector多提供了逆序reverse(),排序sort(),和并merge(),使唯一unique()等数据处理的函数
list one,two;
for(int i=0;i<4;i++)
{
one.push_back(i*5);//0 5 10 15
two.push_back(i*10);//0 10 20 30
}
one.splice(one.begin(),two);//在begin位置拼接整个two列表元素
PrintListInt(one);//0 10 20 30 0 5 10 15
PrintListInt(two);//为空
two.assign(3,2);
one.splice(one.begin(),two,two.begin());//在one列表的前端拼接two列表的一个前端元素
PrintListInt(one);//2 0 10 20 30 0 5 10 15
PrintListInt(two);//2 2
one.splice(one.end(),two,two.begin(),two.end());//在one列表的end位置拼接整个two列表元素
PrintListInt(two);//2 0 10 20 30 0 5 10 15 2 2
PrintListInt(one);//为空
}
//遍历list
void test5()
{
list<int> vec;
for (int i=0;i<10;i++)
{
vec.push_back(i);
}
list<int>::iterator iter;
for (iter=vec.begin();iter!=vec.end();iter++)
cout<<*iter<<" ";
cout<<endl;
list<int>::reverse_iterator reIter;
for (reIter=vec.rbegin();reIter!=vec.rend();reIter++)
cout<<*reIter<<" ";//9 8 7 6 5 4 3 2 1 0
cout<<endl;
vec.reverse();
list<int>::reverse_iterator reveIter=vec.rbegin();
while(reveIter!=vec.rend())
{
cout<<*reveIter<<" ";//0 1 2 3 4 5 6 7 8 9
reveIter++;
}
cout<<endl;
}
void Test(char h)
{
cout<<"press key===="<<h<<endl;
switch(h)
{
case '0': test0();break;
case '1': test1();break;
case '2': test2();break;
case '3': test3();break;
case '4': test4();break;
case '5': test5();break;
case 27:
case 'q':exit(0);break;
default:cout<<"default "<<h<<endl;break;
}
}
void main()
{
while(1)
{
Test(getch());
}
}
deque 上网实例
list的函数共有五大类:定义及初始化,增加删除元素,访问元素,返回迭代器,其他
[cpp] view plain copy print ?
- #include <string>
- #include <deque>
- #include <conio.h>
- #include<iostream>
- using namespace std;
-
- void PrintDequeInt(deque<int> param)
- {
- for (deque<int>::iterator iter=param.begin();iter!=param.end();iter++)
- {
- cout<<*iter<<" ";
- }
- cout<<endl;
- }
- void PrintDequeString(deque<string> param)
- {
- for (deque<string>::iterator iter=param.begin();iter!=param.end();iter++)
- {
- cout<<*iter<<" ";
- }
- cout<<endl;
- }
- void test0()
- {
- deque<int> d;
- deque<int> de(2);
- deque<int> deq(3,5);
- deque<int> dequ(deq);
- deque<int> first(dequ.begin(),dequ.end());
- PrintDequeInt(first);
- d.assign(2,7);
- PrintDequeInt(d);
- de.assign(deq.begin(),deq.end());
- PrintDequeInt(de);
-
- }
-
- void test1()
- {
- deque<string> first(2);
- cout<<first.at(0)<<" "<<first.at(1)<<" "<<endl;
- first.push_back("world");
- first.push_front("hello ");
- first.pop_back();
- first.pop_front();
-
- first.assign(1,"women");
- PrintDequeString(first);
- first.insert(first.begin()+1,"nihao");
- PrintDequeString(first);
- first.insert(first.end(),2,"W");
- PrintDequeString(first);
-
-
- first.erase(first.begin());
- PrintDequeString(first);
- first.erase(first.begin(),first.begin()+2);
- PrintDequeString(first);
- first.clear();
-
-
- }
-
- void test2()
- {
- string str[]={"one","two","three","four","five","six"};
- deque<string> ve(str,str+6);
- for(int i=0;i<6;i++)
- {
- cout<<ve.at(i)<<" ";
- }
- cout<<endl;
- cout<<ve.front()<<endl;
- cout<<ve.back()<<endl;
-
-
- }
-
- void test3()
- {
- deque<int>ve(4);
- ve[0]=0;ve[1]=1;ve[2]=2;ve[3]=3;
- cout<<ve[0]<<" "<<ve[1]<<" "<<ve[2]<<" "<<ve[3]<<endl;
- deque<int>::iterator iter;
- iter=ve.begin();
- cout<<*iter<<endl;
- iter=ve.end();
-
- cout<<*(iter-1)<<endl;
- deque<int>::reverse_iterator reIter;
- reIter=ve.rbegin();
- cout<<*reIter<<endl;
- reIter=ve.rend();
- cout<<*(reIter-1)<<endl;
-
-
- }
-
- void test4()
- {
- deque<string> ve(8,"ss");
- cout<<ve.size()<<endl;
- cout<<ve.max_size()<<endl;
- ve.resize(2);
- deque<string> de(4,"hh");
- de.swap(ve);
- cout<<ve.size()<<" "<<ve.front()<<endl;
- cout<<de.size()<<" "<<de.front()<<endl;
-
-
- }
-
- void test5()
- {
- deque<int> vec;
- for (int i=0;i<10;i++)
- {
- vec.push_back(i);
- }
- for (int i=0;i<vec.size();i++)
- cout<<vec[i]<<" ";
- cout<<endl;
-
- deque<int>::iterator iter;
- for (iter=vec.begin();iter!=vec.end();iter++)
- cout<<*iter<<" ";
- cout<<endl;
-
- deque<int>::reverse_iterator reIter;
- for (reIter=vec.rbegin();reIter!=vec.rend();reIter++)
- cout<<*reIter<<" ";
- cout<<endl;
-
- deque<int>::reverse_iterator revIter;
- for (revIter=vec.rend()-1;revIter!=vec.rbegin();revIter--)
- cout<<*revIter<<" ";
- cout<<endl;
- }
- void Test(char h)
- {
- cout<<"press key===="<<h<<endl;
- switch(h)
- {
- case '0': test0();break;
- case '1': test1();break;
- case '2': test2();break;
- case '3': test3();break;
- case '4': test4();break;
- case '5': test5();break;
- case 27:
- case 'q':exit(0);break;
- default:cout<<"default "<<h<<endl;break;
- }
- }
- void main()
- {
- while(1)
- {
- Test(getch());
- }
- }