C++Set迭代程序未到达Set的末尾

C++ Set Iterators not reaching end of Set

本文关键字:Set 迭代 程序 C++Set      更新时间:2023-10-16

我最近决定尝试为最近结束的topcoder.com竞赛提供C++解决方案,作为学习该语言的一种方式(对C++来说是新手)。然而,当通过std::set对象的迭代没有成功地到达集合中的所有元素时(set.count>#遍历的元素),我感到很困惑。我在StackExchange和其他地方徒劳地寻找过其他经历过这种情况的人。

规格

我已将代码发布到pastebin:http://pastebin.com/U7xQzDQg。

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

如果你编译并运行粘贴在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],

每当试图合并时,都会生成这些行(见第54行);其中Cluster对象的字符串表示由使用标准集合迭代的运算符强制转换方法(参见第97行)生成。

显而易见的是,尽管集合声称拥有正确数量的元素,但在集合中迭代并不能达到所有元素。我认为这可能是对象超出范围并被销毁的问题;但事实并非如此,因为std::set对象在将元素插入数据结构之前会复制元素(并在Position元素上使用析构函数进行测试,建议使用其他方法)。

我真的很不知所措,不想绕过它……因为我认为我在这里错过了一些重要的东西。有人能帮我吗?

最佳,Matthew

您的程序表现出未定义的行为,因为operator<不会为Position对象引入严格弱排序

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;
}

return output.c_str();

是未定义的行为,因为output字符串超出了作用域,并且在函数返回时将删除基础字符数组。

您的operator const char* () const函数可能应该是

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

直接写入CCD_ 5的函数。

记住要free任何你有calloc的东西,或者最好不要在堆上分配东西,如果你能避免的话。