C++Set迭代程序未到达Set的末尾
C++ Set Iterators not reaching end of Set
我最近决定尝试为最近结束的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
的东西,或者最好不要在堆上分配东西,如果你能避免的话。
- 对于set上的循环-获取next元素迭代器
- 在 c++ 中定义一组 set 的迭代器
- 我从 std::set 得到const_iterator而不是迭代器
- 从 std::set 中删除元素,同时在 C++17 中迭代该元素
- 为什么 2 个未初始化的 std::set::迭代器相等?
- 使用 find() 通过 std::set 的迭代器将不起作用。出了什么问题?
- 使用set<set>迭代器的编译错误<int>
- STL SET 迭代器赋值 没有可行的候选者
- map/set迭代器不可递增,我无法从头开始重新启动映射
- std::set::迭代器和std::set::const_iterator之间是否存在操作差异
- std::set::迭代器的大小有限制吗
- std::set::迭代器转换错误
- C ++ map/set 迭代器不能使用 .find 取消引用
- std::set迭代顺序是否始终根据C++规范升序
- map/set迭代器不是可解引用的c++ map
- 对set迭代器解引用会导致seg错误
- 断言失败- map/set迭代器不兼容
- std::set迭代器的Const_pointer_cast
- C++Set迭代程序未到达Set的末尾
- Map /set迭代器不可解引用.多映射容器