2012-01-22 51 views
2

最好的方式,我有一个deque:什么是访问双端队列的元素在C++ STL

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] << " "; 
} 

什么是访问双端队列的元素的最佳途径 - 通过迭代器或类似这样的:My_Deque[i]? has deque < ...>元素指向每个元素的指针数组,以便快速访问其数据,或者以连续方式访问其随机元素(如下图所示)? enter image description here

回答

3

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

5

既然你问了“最好的办法”:

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

你需要什么样的C++版本才能工作? – tjwrona1992

+0

@ tjwrona1992:C++ 11或更高版本。 –

+2

这太糟糕了,我的公司仍然生活在石器时代。哦,也许在几年后他们终于升级了,我可以做出像这样的漂亮干净的循环。 – tjwrona1992

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)); 

这是从一个分段的数据结构复制到另一个分段的数据结构(在引擎盖下的流缓存使用的缓冲区字符成为它们的片段)可以花费相当少的时间(取决于数据可以写入目的地的速度)。

+2

你的'std :: for_each'示例不会被编译。该算法需要第三个参数的一元函数对象。 – Blastfurnace

+0

@Blastfurnace:这的确如此。不知何故,我太渴望与Kerrek SB的回答相匹配。我会解决这个问题:它应该读取'std :: copy()'。谢谢! –

1

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

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