C++中的STL还是比较有用的,尤其是在做科研实现算法的时候,之前也有用过,但是没怎么系统地学过,因此最近找了本书,大致浏览了一下,叶志军的那本《C++ STL开发技术导引》,科普、入门性质的一本书,写得比较浅[呵呵,勿喷]。下面的内容大部分是摘自该书。
deque双端队列容器(double-ended queue),可以在尾部、头部插入、删除元素,采用分块的线性结构来存储数据,两个迭代器分别指向容器的首尾元素,以deque块为单位进行内存分配,使用二级的Map进行管理。
创建deque对象
有以下几种方式来创建deque容器对象。
(1) deque()
该种方式所创建的deque容器已经具有一个对象,只是头尾迭代器重叠,容器中还没有任何元素。
deque<int> d;
(2) deque(size_type n)
创建一个具有n个元素的deque对象,每个元素采用对应类型的默认值。
deque<int> d(10);//10个元素的初始值为0
(3) deque(size_type n,const T& value)
创建一个具有n个元素的deque对象,这些元素的初始值为value。
deque<double> d(10,2.5);
(4) deque(const deque&)
拷贝构造函数。
deque<char> d1(5,’k’);
deque<char> d2(d1);
(5) deque(const InputIterator first,const InputIterator last,const A&a=A())
int array[]={1,2,3,4,5};
deque<int>d(array,array+5);
deque初始化
利用push_back函数在尾部压入新元素。
deque<int> d;
d.push_back(10);
元素的遍历访问
可以采用数组和迭代器的方式进行访问。
利用数组方式访问deque元素:
#include<iostream>
#include<deque>
using namespace std;
int main()
{
deque<int> d;
d.push_back(1);
d.push_back(2);
d.push_back(3);
d.push_back(4);
for(int i=0;i<d.size();i++)
{
cout<<"d["<<i<<"]="<<d[i]<<endl;
}
return 0;
}
用迭代器方式访问deque元素:
#include<iostream>
#include<deque>
using namespace std;
int main()
{
deque<int> d;
d.push_back(1);
d.push_back(2);
d.push_back(3);
d.push_back(4);
deque<int>::iterator begin,end;
end=d.end();
int i;
for(begin=d.begin(),i=0;begin!=end;begin++,i++)
{
cout<<*begin<<endl;
}
return 0;
}
元素的插入
deque使用了两个迭代器分别指向双端队列的首尾,deque有高效的头部插入元素的函数push_front(),其原型为:
void push_front(const T&);
其他位置的插入涉及元素的移位拷贝,insert函数在pos位置之前插入元素x,
Iterator insert(iterator pos,const T& x);
例:
#include<iostream>
#include<deque>
using namespace std;
int main()
{
deque<int> d;
d.push_back(1);
d.push_back(2);
//头部插入
d.push_front(3);
for(int i=0;i<d.size();i++)
{
cout<<d[i]<<" ";
}
cout<<endl;
//中间位置插入
d.insert(d.begin()+2,4);//在第3个元素之前插入4
for(int i=0;i<d.size();i++)
cout<<d[i]<<" ";
cout<<endl;
return 0;
}
元素的删除
删除首元素pop_front函数,删除尾元素pop_back函数,删除任意位置或者迭代区间erase函数,删除所有元素clear函数。
#include<iostream>
#include<deque>
using namespace std;
int main()
{
deque<int> d;
d.push_back(1);
d.push_back(2);
d.push_back(3);
d.push_back(4);
d.push_back(5);
for(int i=0;i<d.size();i++)
{
cout<<d[i]<<" ";
}
cout<<endl;
//头尾和任意位置删除元素
d.erase(d.begin()+2);//删除第3个元素
d.pop_front();
d.pop_back();
for(int i=0;i<d.size();i++)
{
cout<<d[i]<<" ";
}
cout<<endl;
d.clear();//删除所有元素
cout<<d.size()<<endl;
return 0;
}
元素的反向遍历
反向迭代器reverse_iterator和const_reverse_iterator。
#include<iostream>
#include<deque>
using namespace std;
int main()
{
deque<int> d;
d.push_back(1);
d.push_back(2);
d.push_back(3);
d.push_back(4);
d.push_back(5);
//前向遍历
deque<int>::iterator begin,end;
end=d.end();
for(begin=d.begin();begin!=end;begin++)
cout<<*begin<<" ";
cout<<endl;
//反向遍历
deque<int>::reverse_iterator rbegin,rend;
rend=d.rend();
for(rbegin=d.rbegin();rbegin!=rend;rbegin++)
cout<<*rbegin<<" ";
cout<<endl;
return 0;
}
deque的交换
利用swap函数进行交换。
#include<iostream>
#include<deque>
using namespace std;
void print(deque<int> &d)
{
for(int i=0;i<d.size();i++)
cout<<d[i]<<" ";
cout<<endl;
}
int main()
{
//d1
deque<int> d1;
d1.push_back(1);
d1.push_back(2);
cout<<"-----------交换前:"<<endl;
cout<<"d1=";
print(d1);
//d2
deque<int> d2;
d2.push_back(3);
d2.push_back(4);
d2.push_back(5);
cout<<"d2=";
print(d2);
cout<<"-----------交换后:"<<endl;
d1.swap(d2);
cout<<"d1=";
print(d1);
cout<<"d2=";
print(d2);
return 0;
}
其他函数
bool empty()
size_type size()
size_type max_size()
reference front()
reference back()
版权声明:本文为博主原创文章,未经博主允许不得转载。