在C ++ STL中访问deque元素的最佳方法是什么

时间:2012-01-22 23:00:34

标签: c++ stl deque

我有一个双胞胎:

deque<char> My_Deque;
My_Path.push_front('a');
My_Path.push_front('b');
My_Path.push_front('c');
My_Path.push_front('d');
My_Path.push_front('e');

有这样的方式输出它。

第一个:

deque<char>::iterator It;
for ( It = My_Deque.begin(); It != My_Deque.end(); It++ )
    cout << *It <<  " ";

第二个:

for (i=0;i<My_Deque.size();i++) {
    cout << My_Deque[i] <<  " ";
}

访问deque元素的最佳方法是什么 - 通过迭代器或像这样:My_Deque[i]? 有一个deque&lt; ...&gt; element一个指向每个元素的指针数组,用于快速访问它的数据,或者以连续的方式提供对它的随机元素的访问(如下图所示)? enter image description here

4 个答案:

答案 0 :(得分:6)

因为你要求“最好的方法”:

for (char c : My_Deque) { std::cout << c <<  " "; }

答案 1 :(得分:3)

STL deque通常实现为固定大小数组的动态数组,因此索引访问非常有效。

答案 2 :(得分:1)

因为你要求“最好的方法”:

std::copy(My_Deque.begin(), My_Deque.end(),
          std::ostream_iterator<char>(std::cout, " "));

不可否认,对于单个对象的格式化它不会有太大的区别,但使用分段数据结构的算法可以产生重大影响!在处理整个范围时,单独处理段时可以进行有趣的优化。例如,如果你有一个很大的std::deque<char>,你想逐字写入一个文件,比如

std::copy(deque.begin(), deque.end(), std::ostreambuf_iterator<char>(out));

从一个分段数据结构复制到另一个分段数据结构(在引擎流缓冲区下使用一个字符缓冲区成为它们的段)可以花费更少的时间(在某种程度上取决于数据写入数据的速度)但是,目的地。

答案 3 :(得分:1)

该标准规定deque应该在固定时间内支持随机访问。所以是的,[i]应该相当快。

但我认为,使用迭代器仍然是一个优势。它(理论上至少)可以是更快的常数倍(或者可能更慢!)。无论如何,每次使用[i]都会涉及查找某些表格并计算偏移量等等。我认为deque :: iterator的operator++稍微不仅仅是“找到我的偏移量;向它添加1;用新偏移量查找”