std :: set的迭代不会结束

问题描述:

今天我试图打印一个集合的元素,它进入了一个无限循环。 当我试图获取集的大小,它返回我正确的值是8std :: set的迭代不会结束

代码就像它上面获取大小之前宣布这个

 std::cout << "size of set is " << myset.size(); 
    for(it=myset.begin();it!=myset.end();it++) 
    std::cout << "value is : " << *it; 

迭代器。其中一个有趣的事实是,打印时,其中一个预期的元素从设置中丢失。

我知道我会对你生气或犯一些愚蠢的错误,但我担心的是,它是 myset.end()指向一些随机的地方吗?但是,即使如此,为什么是它衍生自组的元素,同时印刷,而不是崩溃

+5

问题在于你没有向我们展示的代码。 – 2012-01-12 17:59:11

+0

我的担心是可以结束()函数去haywire ...我从来没有见过它 第二件事是为什么它给大小为8,我有for循环正好在我打印大小的语句下面。它怎么会发生这样的错误? – Invictus 2012-01-12 18:03:22

+0

请发布一个*完整的*,*最小*示例程序,以显示您的错误。一个* complete *程序是我们可以复制粘贴和编译的程序。一个*最小*程序不包含与您的问题无关的行。我知道制作一个似乎很难,但它很有价值。我们将能够更好地解决您的问题。另外,您可以在生产最小样本时自行解决。请参阅http://sscce.org/。 – 2012-01-12 18:11:35

所有STL容器指向容器的一个过去的最末端返回的.end()迭代器,并取消引用它(*iterator)结果未定义的行为。

您的for循环不会解除引用.end()虽然它会在您的迭代器等于.end()时停止,因此这不应该成为您发布的代码中的问题。您之前可能在其他代码中犯了不同的错误。

+0

是的,它会导致分段错误。但我的情况是不同的。我没有得到任何错误,除了它无限循环无限大小显示为8 :( – Invictus 2012-01-12 18:06:34

+0

你已经发布的循环不会显示大小,你的尺寸线在循环之上。发布你的真实代码,所以我们可以找到真正的错误:) – 2012-01-12 18:07:28

+0

耶循环将只打印设置中的元素。由于它进入了有限循环,我打印了大小以检查显示的大小是多少。实际的代码是冗长的,并且是一个保密的代码,我猜这很难让我在这里复制 – Invictus 2012-01-12 18:10:33