gpt4 book ai didi

c++ - std::advance on std::sets 的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:24:16 25 4
gpt4 key购买 nike

我偶然发现了我认为是 stl algorithm advance 中的错误。 .

当我将迭代器推进到容器末尾时,我得到了不一致的结果。有时我得到 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()。

[tim@saturn 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
[tim@saturn 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.

[tim@saturn advance]$ g++ -DEXPERIMENT=1 advance.cc
[tim@saturn advance]$ ./a.out
the end
[tim@saturn advance]$ g++ -DEXPERIMENT=2 advance.cc
[tim@saturn advance]$ ./a.out
the end
[tim@saturn advance]$ g++ -DEXPERIMENT=3 advance.cc
[tim@saturn advance]$ ./a.out
wuh? 9
[tim@saturn advance]$ g++ -DEXPERIMENT=4 advance.cc
[tim@saturn advance]$ ./a.out
the end
[tim@saturn advance]$ g++ -DEXPERIMENT=5 advance.cc
[tim@saturn advance]$ ./a.out
wuh? 9
[tim@saturn advance]$ g++ -DEXPERIMENT=6 advance.cc
[tim@saturn advance]$ ./a.out
the end
[tim@saturn advance]$ g++ -DEXPERIMENT=7 advance.cc
[tim@saturn advance]$ ./a.out
the end
[tim@saturn 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());

我认为断言应该适用于其他容器类型,不是吗?

我错过了什么?

谢谢!

最佳答案

STL advance算法没有bug。

如果你前进到一个集合的末尾会发生什么是未定义的。

Undefined behavior是C/C++中的一个通用概念,结果对undefined behavior总是有效的,因为……是undefined behavior。

如果你做了一些给出未定义行为的事情,你的程序中很可能会有一个错误。

关于c++ - std::advance on std::sets 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2530796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com