Играя с классом std::map стандартной библиотеки С++, я заметил, что если я удалю элемент, а затем попытаюсь сослаться на него (закомментированная строка в коде ниже), элемент вернется со значением 0. Ожидается ли это ? Вам действительно нужно использовать функцию поиска для доступа к элементу, не создавая его случайно, если он не существует?
настройка компилятора: я компилирую на OSX 10.8.3 с помощью g++ i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (на основе Apple Inc. build 5658) (LLVM build 2336.11.00)
using namespace std;
map<int,int> myMap;
map<int,int>::iterator it;
myMap[1] = 5;
for (it=myMap.begin(); it!=myMap.end(); ++it)
std::cout << it->first << " => " << it->second << '\n';
printf("map test result: %d\n", myMap[1]);
it = myMap.find(1);
myMap.erase( it );
// If I uncomment this it will cause a 0 value to occur at key 1.
//printf("map test result: %d\n", myMap[1]);
if (myMap.find(1) == myMap.end())
puts("element key 1 is null, ok");
else
puts("element @ key 1 exists, error");
if (myMap.empty())
puts("map is empty");
else
puts("map is not empty, error");
for (it=myMap.begin(); it!=myMap.end(); ++it)
std::cout << it->first << " => " << it->second << '\n';
Просто чтобы уточнить, если я запускаю это со второй прокомментированной строкой printf, она работает, как и ожидалось:
1 => 5
map test result: 5
element key 1 is null, ok
map is empty
Если я запускаю строку без комментариев, доступ к myMap[1] в операторе printf создает еще один элемент и оставляет такой результат:
1 => 5
map test result: 5
map test result: 0
element @ key 1 exists, error
map is not empty, error
1 => 0