在使用相同C++代码的跨平台窗体之间获取运行时错误

Getting run time error between cross- plateform with same C++ code

本文关键字:窗体 跨平台 之间 获取 运行时错误 代码 C++      更新时间:2023-10-16

我正在使用以下代码从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++;
}