您的位置:首页 > 产品设计 > UI/UE

STL 之 deque

2014-03-05 18:44 225 查看
deque常用函数列表
begin第一个节点
end最后一个节点(此节点在数据区之外)
rbegin反转的第一个节点
rend反转的最后一个节点
crbegin常量,不可改变值
crend-(同上)
cbegin-
cend-
clear清空数据区(但保留一个缓冲区)
push_back在尾端添加节点
push_front在首端添加节点
pop_back移除尾端
pop_front移除首端
erase1,de.erase(position):清除某一位置
2,de.erase(first, last):清除某一区间
insert1,de.insert(position, val):在位置position插入元素val
2,de.insert(position, n, val):在位置position插入n个元素val
3,de.insert(position, first, last):在位置position插入另一容器的first-last区间
resize1,resize(n ,val=0):设置大小为n,填充为val
assign1,assign(n, val=0)
2,assign(first, last)
empty 
swap交换两个容器
 

deque数据结构比较特殊,它是由map指针与数据缓冲区组成,每个map节点指向一个数据缓冲区;每次需要扩充时,都是以缓冲区为单位扩充的,每次扩充一个,deque至少应有一个缓冲区。

deque也是最灵活的数据结构,它重载了几乎所有的操作、运算符。

下图是从STL-源码剖析中copy出来的,它充分说明了deque的存储结构:



以下是实践代码:

#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <deque>
#include <iterator>
#include <ctime>

using namespace std;

void O(deque<int>de, char* s)
{
cout << s << endl;
copy(de.begin(), de.end(), ostream_iterator<int>(cout, " "));
if (de.empty()) cout << "E";
cout << endl << endl;
}
int main()
{
deque<int>de, d2;
deque<int>::iterator iter;
deque<int>::reverse_iterator rev_iter;
deque<int>::const_iterator con_iter;
int i, j, k;

srand(time(NULL));
for (i = 0; i < 4; i++)
de.push_back(rand()%(rand()%1000+10));
for (i = 0; i < 4; i++)
de.push_back(rand()%(rand()%10000+20));
O(de, "----de----");
cout << sizeof(de) << endl;

de.pop_back();
O(de, "----pop_back----");
de.pop_front();
O(de, "----pop_front----");
cout << de.size() << endl; // 大小

d2.clear();
O(d2, "----init----");
d2.assign(de.begin(), de.end());
O(d2, "----assign d2----");
de.assign(4, 1);
O(de, "----assign----");

cout << "----ex at----" << endl;
cout << d2.at(3) << endl;
cout << "----ex front----" << endl << d2.front() << endl;
cout << "----ex back----" << endl << d2.back() << endl;

cout << "----reverse----" << endl;
for (rev_iter = d2.rbegin(); rev_iter != d2.rend(); rev_iter++)
cout << *rev_iter << " ";
cout << endl << endl;

de.resize(1);
O(de, "----resize(1)----");
de.resize(5, 2);
O(de, "----resize(5,2)----");

de.erase(de.begin());
O(de, "----erase(de.begin())----");
de.insert(de.begin(), 4);
O(de, "----insert(de.begin(), 4)----");
de.insert(de.begin(), 4, -10);
O(de, "----insert(de.begin(), 4, -10)----");
de.insert(de.begin(), d2.begin(), d2.begin()+2);
O(d2, "----d2 value----");
O(de, "----insert(de.begin(), d2.begin(), d2.begin()+2)----");

O(d2, "-----d2 value----");
O(de, "-----de value----");
de.swap(d2);
O(d2, "-----after d2 value----");
O(de, "-----after de value----");

con_iter = de.cbegin(); //con_iter是常量不能进行赋值,类似的还有cend, crbegin, crend
cout << *con_iter << endl;

getchar();
exit(0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CC++ STL