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

标签 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++;
    }
}

最佳答案

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?

关于c++ - 使用相同的 C++ 代码在跨平台之间获取运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38567478/

相关文章:

android - React Native Video 不显示播放器

c++ - 用于迭代 "between each consecutive pair of elements"的成语

C++:priority_queue:模板参数中的 lambda 表达式

c++ - 从 char * 中的整数填充 vector<int>

java - 使用 glfw 删除最小化和最大化按钮

html - 下拉框高度 : browser/OS compatibility issues

c++ - 我需要 2 个套接字来进行多播发送和单播读取吗?

c++ - 分析一个 dll 插件

c++ - 将 std::multimap 转换为 std::priority_queue

C++ std::transform 副作用