我有一个双胞胎:
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一个指向每个元素的指针数组,用于快速访问它的数据,或者以连续的方式提供对它的随机元素的访问(如下图所示)?
答案 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;用新偏移量查找”