在使用相同C++代码的跨平台窗体之间获取运行时错误
Getting run time error between cross- plateform with same C++ code
我正在使用以下代码从C++多映射中擦除元素,这些代码在Linux下运行良好,但在Windows上抛出表达式集/映射是不可增加的。
void delete_entries(multimap<int, pair<int, int> > &m, int i, int j) {
// This function deletes entries from multimap where box number == i and Ball index ==j
multimap<int, pair<int, int> > ::iterator it = m.begin();
while (it != m.end()) {
if ((*it).second.first == i || (*it).second.second == j)
m.erase(it);
it++;
}
}
while (it != m.end()) {
if ((*it).second.first == i || (*it).second.second == j)
m.erase(it);
it++; //if the previous condition holds true, 'it' is invalidated
}
已擦除的迭代器将失效。递增无效迭代器是未定义的行为。
未定义的行为意味着,即使看起来有效,也无法保证整个程序的行为(这也适用于linux中看似有效的一个;你应该很高兴它在MSVC上崩溃了)
有关擦除的正确方法,请参阅此处的其他答案和此问题:如何在迭代地图时从地图中删除?
由于C++11,erase返回最后一个删除元素后面的迭代器。
void delete_entries(multimap<int, pair<int, int> > &m, int i, int j) {
// this function deletes entries from multimap where box number == i and Ball index ==j
multimap<int, pair<int, int> > ::iterator it = m.begin();
while (it != m.end()) {
if ((*it).second.first == i || (*it).second.second == j)
it = m.erase(it);
else
it++;
}
}
迭代器在擦除后变为无效。由于C++11,你可以做:
while (it != m.end()) {
if ((*it).second.first == i || (*it).second.second == j)
it = m.erase(it);
else
it++;
}
相关文章:
- 通过网络、跨平台传递std::变体是否安全
- 如何跨平台将二进制资源构建到程序中?
- 如何更改窗体上所有控件的标题?[C++生成器]
- 以跨平台的方式将图像源路径从C++发送到 QML
- 跨平台 GPU 计算
- 在哪里存储跨平台C++应用存储?
- 如何将外部依赖引入跨平台CMake项目?
- 将 VS Code 用于跨平台可缩放C++项目
- 创建跨平台 C++ 触摸管理器.在 c++ 中传递 Objective-c 对象涉及代码
- 使用通配符的跨平台文件列表
- 在这种情况下,如何防止C++输出/控制台窗体关闭
- 使用非托管导出显示和关闭 C# 窗体 C++
- 如何使用跨平台代码在C++中设置系统时间?
- 跨平台 c++ 和 Visual Studio 2017?
- 跨平台随机重现性
- c++中的交叉编译(作为跨平台应用程序的一部分或作为服务)
- 如何在Windows窗体应用程序中打开txt文件并将行导入文本框
- 使用Visual Studio进行跨平台C++开发
- 将变量从主窗口传递到另一个qt c++窗体
- 在使用相同C++代码的跨平台窗体之间获取运行时错误