Performance 对于较大的列表,std::list.begin()会减慢速度

Performance 对于较大的列表,std::list.begin()会减慢速度,performance,list,c++11,stl,Performance,List,C++11,Stl,我有以下问题。我需要实现LexBFS算法,它必须使用双链表。我选择了std::list。当我最终调试代码时,我注意到了奇怪的行为——列表操作随着列表的增长而减慢。我把范围缩小到这一行: // start new iteration clock_t tbegin = clock(); if(L.size() && L.begin()->empty) { double ee = double(clock() - tbegin) / CLOCKS_PER_SEC; cer

我有以下问题。我需要实现LexBFS算法,它必须使用双链表。我选择了
std::list
。当我最终调试代码时,我注意到了奇怪的行为——列表操作随着列表的增长而减慢。我把范围缩小到这一行:

// start new iteration
clock_t tbegin = clock();
if(L.size() && L.begin()->empty) {
  double ee = double(clock() - tbegin) / CLOCKS_PER_SEC;
  cerr << fixed << setprecision(6) << "t: " << ee << " size: " << L.size() << "\n";
  //...
}
// here I make other operations on L...
简单查找会减慢速度!发生了什么事

提前谢谢

编译标志:

clang++ a.cpp -o ./a -std=c++11 -Wall -g 

Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu
Thread model: posix

在C++98中,list.size()不要求为O(1)


尝试在C++11模式下编译

我猜是std::list::size导致了计时结果。。。或者不是。从C++11开始,它必须是恒定的复杂性。阅读:我使用-std=C+11。您将需要GCC 5+,因为由于ABI中断,std::list的O(n)大小比预期的长一点
clang++ a.cpp -o ./a -std=c++11 -Wall -g 

Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu
Thread model: posix