C++;集合迭代器未到达集合的结尾 我最近决定尝试一个C++解决方案,作为最近结束的TopCoDeCo竞争,作为学习语言的一种方式(对于C++来说是新的)。然而,当通过std::set对象的迭代未能成功到达集合中的所有元素时(set.count>#元素被遍历),我就被难住了。我在StackExchange和其他地方寻找过这样经历的人,但都是徒劳的

C++;集合迭代器未到达集合的结尾 我最近决定尝试一个C++解决方案,作为最近结束的TopCoDeCo竞争,作为学习语言的一种方式(对于C++来说是新的)。然而,当通过std::set对象的迭代未能成功到达集合中的所有元素时(set.count>#元素被遍历),我就被难住了。我在StackExchange和其他地方寻找过这样经历的人,但都是徒劳的,c++,set,stdset,C++,Set,Stdset,具体内容 我已将代码发布到pastebin: 我试图做的是一个简单的聚类算法。我确信有更好的方法来实现我想做的事情;但在这个阶段,我对此并不感兴趣(因为我的重点是学习语言及其特性)。我用一个属性为“x”和“y”的位置对象表示笛卡尔网格中的正方形。使用迭代方法,我扫描整个网格,寻找相同颜色的对象,将它们分组为簇对象。当算法完成时,将有一组簇,每个簇包括一组间距不超过设定距离的位置对象。在算法过程中的某个时刻,需要合并彼此接近的簇;这就是我开始有问题的地方 如果编译并运行pastebin上发布的代码

具体内容

我已将代码发布到pastebin:

我试图做的是一个简单的聚类算法。我确信有更好的方法来实现我想做的事情;但在这个阶段,我对此并不感兴趣(因为我的重点是学习语言及其特性)。我用一个属性为“x”和“y”的位置对象表示笛卡尔网格中的正方形。使用迭代方法,我扫描整个网格,寻找相同颜色的对象,将它们分组为簇对象。当算法完成时,将有一组簇,每个簇包括一组间距不超过设定距离的位置对象。在算法过程中的某个时刻,需要合并彼此接近的簇;这就是我开始有问题的地方

如果编译并运行pastebin上发布的代码,您将看到如下消息:

TO MERGE:
Cluster of size 1: [1,1], 
Cluster of size 2: [0,1], [0,2], 
MERGED: 0x7fffb5e9b970Cluster of size 3: [0,1], [1,1], 
如果我的代码工作正常,最后一行应该显示的内容是:

MERGED: <Memory Address of Cluster>Cluster of size 3: [0,1], [1,1], [0,2],
合并:大小为3的集群:[0,1],[1,1],[0,2],
无论何时尝试合并,都会生成这些行(参见第54行);通过使用标准集迭代的运算符转换方法(参见第97行)生成的集群对象的字符串表示

很明显,尽管集合声称拥有正确数量的元素,但遍历集合并不能达到所有元素。我认为这可能是对象超出范围并被破坏的问题;但情况似乎并非如此,因为std::set对象在将元素插入数据结构之前复制元素(并使用析构函数对其他建议的位置元素进行测试)

我真的不知所措,不想绕圈子。。。因为我认为我在这里遗漏了一些重要的东西。有人能帮我吗

最好的, 马修

这个

return output.c_str();
是未定义的行为,因为当函数返回时,
输出
字符串超出范围,并且基础字符数组被删除

您的
运算符const char*()const
函数可能是

friend std::ostream& operator<<(std::ostream&, Cluster const&)

friend std::ostream&operator您的程序显示未定义的行为,因为您的
operatorother.y)返回false;
返回x
谢谢您的评论。我知道各种各样的内存问题(比如这个),但我不认为它们影响了我提到的问题。我遇到的问题被Oktalist解决了;但我也会接受你的评论:)。
bool operator< (Position other) const {
    return other.x - x + 100*(other.y - y);
}
bool operator< (Position other) const {
    if (y < other.y) return true;
    if (y > other.y) return false;
    return x < other.x;
}