我已經偶然發現了我認爲是stl algorithm advance中的一個錯誤。問題與std :: advance std :: sets
當我將容器末端的迭代器推進時,出現不一致的結果。有時候我會得到container.end(),有時我會得到最後一個元素。我用下面的代碼說明這一點:
#include <algorithm>
#include <cstdio>
#include <set>
using namespace std;
typedef set<int> tMap;
int main(int argc, char** argv)
{
tMap::iterator i;
tMap the_map;
for (int i=0; i<10; i++)
the_map.insert(i);
#if EXPERIMENT==1
i = the_map.begin();
#elif EXPERIMENT==2
i = the_map.find(4);
#elif EXPERIMENT==3
i = the_map.find(5);
#elif EXPERIMENT==4
i = the_map.find(6);
#elif EXPERIMENT==5
i = the_map.find(9);
#elif EXPERIMENT==6
i = the_map.find(2000);
#else
i = the_map.end();
#endif
advance(i, 100);
if (i == the_map.end())
printf("the end\n");
else
printf("wuh? %d\n", *i);
return 0;
}
其中我得到實驗3以下意外(根據我的)行爲和5從哪裏獲得的最後一個元素,而不是the_map.end的()。
[[email protected] advance]$ uname -srvmpio
Linux 2.6.18-1.2798.fc6 #1 SMP Mon Oct 16 14:37:32 EDT 2006 i686 athlon i386 GNU/Linux
[[email protected] advance]$ g++ --version
g++ (GCC) 4.1.1 20061011 (Red Hat 4.1.1-30)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[[email protected] advance]$ g++ -DEXPERIMENT=1 advance.cc
[[email protected] advance]$ ./a.out
the end
[[email protected] advance]$ g++ -DEXPERIMENT=2 advance.cc
[[email protected] advance]$ ./a.out
the end
[[email protected] advance]$ g++ -DEXPERIMENT=3 advance.cc
[[email protected] advance]$ ./a.out
wuh? 9
[[email protected] advance]$ g++ -DEXPERIMENT=4 advance.cc
[[email protected] advance]$ ./a.out
the end
[[email protected] advance]$ g++ -DEXPERIMENT=5 advance.cc
[[email protected] advance]$ ./a.out
wuh? 9
[[email protected] advance]$ g++ -DEXPERIMENT=6 advance.cc
[[email protected] advance]$ ./a.out
the end
[[email protected] advance]$ g++ -DEXPERIMENT=7 advance.cc
[[email protected] advance]$ ./a.out
the end
[[email protected] advance]$
從SGI網站(見頂部鏈接),它有下面的例子:
list<int> L;
L.push_back(0);
L.push_back(1);
list<int>::iterator i = L.begin();
advance(i, 2);
assert(i == L.end());
我認爲,斷言應適用於其他容器類型,不是嗎?
我錯過了什麼?
謝謝!