微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

中止核心转储从C ++中的向量中删除元素

如何解决中止核心转储从C ++中的向量中删除元素

我正在尝试使用“ MUD游戏编程”学习C ++,并且正在研究示例,但是当我尝试从向量中删除连接时,出现错误:“已中止(核心被弃用)”。通常在从向量中删除最后一个时会发生这种情况。我已经尝试了一些解决方案,例如在删除之前检查迭代器!= connlist.end(),并尝试使用connlist.clear()(如果列表中仅剩一个元素),但是这些似乎无济于事

我正在使用g ++进行Cygwin的编译和工作。

错误发生在connlist.erase()上,您看到的该错误用户键入“退出”时被调用

kmeans_pca = KMeans(n_clusters=3,random_state=42).fit(features)
>> ValueError: Found array with dim 4. Estimator expected <= 2.

作为参考,这本书是: 罗恩·彭顿。 MUD游戏编程。美国马萨诸塞州波士顿:课程技术/参与学习,2003年。

解决方法

您正在迭代向量并在循环内擦除其中的元素。这绝不是一个好主意。 vector::erase使您随后用于进一步迭代的迭代器无效。

请参阅:https://en.cppreference.com/w/cpp/container/vector/erase

这样做的原因是,向量可能会在擦除元素时重新分配和/或移动元素。

可能的解决方案:

只需关闭循环中的那些连接,然后再执行删除操作:

connlist.erase(std::remove_if(connlist.begin(),connlist.end(),is_closed),connlist.end());

is_closed类似于:

is_closed = [](const SocketLib::Connection& c) {return !c.open();};

PS:我不知道SocketLib,所以您可能会稍微更改is_closed

PPS:对for(auto& connection : connlist) {...}之类的循环使用基于范围的

编辑:

如评论中所述,在这种情况下,向量将不会重新分配,其他点仍然存在。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。