C++-STL容器deque使用

C++-STL容器deque使用

归属感 发布于 2017-07-13 字数 2226 浏览 1164 回复 1

STL源码剖析上有这样一段代码:

#include <deque>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
deque<int,alloc,32> ideq(20,9); // 注意,alloc 只适用于 G++
cout << "size=" << ideq.size() << endl; // size=20
// 现在,应该已经建构了一个 deque,有 20 个 int 元素,初值皆为 9。
// 缓冲区大小为 32bytes。

// 为每一个元素设定新值。
for(int i=0; i<ideq.size(); ++i)
ideq[i] = i;

for(int i=0; i<ideq.size(); ++i)
cout << ideq[i] << ' '; // 0 1 2 3 4 5 6...19
cout << endl;

// 在最尾端增加 3 个元素,其值为 0,1,2
for(int i=0;i<3;i++)
ideq.push_back(i);

for(int i=0; i<ideq.size(); ++i)
cout << ideq[i] << ' '; // 0 1 2 3 ... 19 0 1 2
cout << endl;
cout << "size=" << ideq.size() << endl; // size=23

// 在最尾端增加 1 个元素,其值为 3
ideq.push_back(3);
for(int i=0; i<ideq.size(); ++i)
cout << ideq[i] << ' '; // 0 1 2 3 ... 19 0 1 2 3
cout << endl;
cout << "size=" << ideq.size() << endl; // size=24

// 在最前端增加 1 个元素,其值为 99
ideq.push_front(99);
for(int i=0; i<ideq.size(); ++i)

cout << ideq[i] << ' '; // 99 0 1 2 3...19 0 1 2 3
cout << endl;
cout << "size=" << ideq.size() << endl; // size=25

// 在最前端增加 2 个元素,其值分别为 98,97
ideq.push_front(98);
ideq.push_front(97);
for(int i=0; i<ideq.size(); ++i)
cout << ideq[i] << ' '; // 97 98 99 0 1 2 3...19 0 1 2 3
cout << endl;
cout << "size=" << ideq.size() << endl; // size=27

// 搜寻数值为 99 的元素,并打印出来。
deque<int,alloc,32>::iterator itr;
itr =find(ideq.begin(), ideq.end(), 99);
cout << *itr << endl;
cout << *(itr.cur) << endl;
}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

偏爱自由 2017-09-24 1 楼

你说的这个地方应该是作者的笔误,我看的电子版的《STL源码剖析》中的这个例子,两处都是deque<int,alloc,32> ,其中32代表的是是元素个数

至于32代表的是元素个数,证据如下:
看看deque迭代器重载的+=运算符的源码(源码来自侯捷的《STL源码剖析》):

self& operator+=(difference_type n)
{
difference_type offset = n + (cur - first);
if (offset >= 0 && offset < difference_type(buffer_size())) //这一句中difference_type(buffer_size())返回的值跟迭代器的offset做运算(关于buffer——size()的返回值看下面的函数代码),可以看出这个返回的值就是元素的个数而不是字节数
cur += n;
else {
...
...
...
}

static size_t buffer_size() {return__deque_buf_size(BufSiz, sizeof(T));

//如果 n不为 0,传回 n,表示 buffer size 由使用者自定。
//如果 n为 0,表示 buffer size使用默认值,那么
//如果 sz(元素大小,sizeof(value_type))小于 512,传回 512/sz,
//如果 sz 不小于 512,传回 1。
inlinesize_t __deque_buf_size(size_t n, size_t sz)
{
return n != 0 ? n : (sz < 512 ? size_t(512 / sz) : size_t(1));
}