在具有相同 C++ 代码的跨平台之间出现 运行 时间错误
Getting run time error between cross- plateform with same C++ code
我正在使用以下代码从 C++ 多重映射中擦除元素,该代码 运行 完全在 Linux 下,但是抛出表达式 set/map 在 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++11 起,您可以:
while (it != m.end()) {
if ((*it).second.first == i || (*it).second.second == j)
it = m.erase(it);
else
it++;
}
自 C++11 起,删除 returns 最后删除的元素之后的迭代器。
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++ 多重映射中擦除元素,该代码 运行 完全在 Linux 下,但是抛出表达式 set/map 在 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++11 起,您可以:
while (it != m.end()) {
if ((*it).second.first == i || (*it).second.second == j)
it = m.erase(it);
else
it++;
}
自 C++11 起,删除 returns 最后删除的元素之后的迭代器。
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++;
}
}