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

时间:2016-07-25 12:13:42

标签: c++ stl cross-platform

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

3 个答案:

答案 0 :(得分:2)

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上崩溃了)

有关正确的删除方式,请参阅此处的其他答案以及此问题:How to remove from a map while iterating it?

答案 1 :(得分:2)

从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++;
  }
}

答案 2 :(得分:1)

擦除后迭代器变为无效。从C ++ 11开始,你可以这样做:

while (it != m.end()) {
    if ((*it).second.first == i || (*it).second.second == j)
        it = m.erase(it);
    else
        it++;
}