Я читал в стандарте С++ 14, что порядок элементов сохраняется при использовании erase(iterator pos)
из unordered_set
.
Я попробовал следующий код с g++-6.2.0 и clang-3.9 (хотя в Linux это stdlib этого gcc). Я думаю, что оба должны быть в состоянии справиться с этим по спецификации С++ 14:
#include <unordered_set>
#include <iostream>
using std::unordered_set; using std::cout;
// output
template<typename Elem, typename Comp>
std::ostream& operator<<(std::ostream&os, const unordered_set<Elem,Comp>&data) {
for(auto &e : data) { os << e << ' '; } return os << '\n'; }
int main() {
unordered_set<int> nums{ 1,2,3,4,5,6,7,8,9,10 };
cout << nums; // MSVC: 9 1 2 3 4 5 6 7 8 10
for(auto it = nums.begin(); it!=nums.end(); ++it) {
if(*it % 2 == 0) {
nums.erase(it);
}
}
cout << nums; // MSCV: 9 1 3 5 7
}
Да, порядок элементов произвольный. Здесь у MSVC++ 19.00 было 9 1 2 3 4 5 6 7 8 10
. И после стирания всех четных элементов оставшиеся элементы остаются в том же порядке 9 1 3 5 7
.
Однако с g++ и clang++ я получил совершенно плохой результат
10 9 8 7 6 5 4 3 2 1
9 8 7 6 5 4 3 2 1
что, по-видимому, указывает на то, что порядок элементов не сохранялся между вызовами, а просто... я не знаю.
Что происходит?