问题描述
我正在尝试使用“ 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) {...}
之类的循环使用基于范围的
编辑:
如评论中所述,在这种情况下,向量将不会重新分配,其他点仍然存在。