std::unordered_map 迭代器 returns 擦除键,为什么以及如何跳过它们

std::unordered_map iterator returns erased keys, why and how to skip them

我是 C++ 编程的新手,偶然发现了一种让我感到困惑并使我的编码更加困难的行为。我搜索了一下答案,但找不到任何东西——我也浏览了 C++ 参考页面,但也没有帮助(如果答案在那里,请不要把我钉在十字架上——该页面不是解释的榜样事物)。也许我遗漏了一些非常明显的东西。

有人可以解释一下 std::unordered_map 的以下行为吗?

std::unordered_map<std::string, std::string> test_map;
test_map["test_key_1"] = "test_value_1";
test_map["test_key_2"] = "test_value_2";

std::cout <<  "'test_key_1' value: " << test_map["test_key_1"] << std::endl; // This returns "test_value_1"
std::cout << "test_map size before erase: " << test_map.size() << std::endl; // This returns 2

test_map.erase("test_key_1");

std::cout << "test_map size after erase: " << test_map.size() << std::endl; // This returns 1
std::cout << "'test_key_1' value after erase: " << test_map["test_key_1"] << std::endl; // This returns empty string
std::cout << "'non_existing_key' value: " << test_map["non_existing_key"] << std::endl; // This returns empty string

test_map.rehash(test_map.size()); // I am doing this because vague hints from internet, code behaves
                                  // same way without it.

for (std::unordered_map<std::string, std::string>::iterator it = test_map.begin();
     it != test_map.end(); ++it)
{
    std::cout << "Key: " << it->first << std::endl;
}
// Above loop return both 'test_key_1' and 'test_key_2'.
// WHY!?

为什么迭代器 returning 已经被删除的项目?如何使迭代器 return 仅存在于 map 中的项目? 我将不胜感激任何帮助,因为我真的迷路了。

您正在使用 operator[] 访问以前删除的元素

Returns a reference to the value that is mapped to a key equivalent to key, performing an insertion if such key does not already exist.

如果您只需要搜索给定的键,请使用 find 方法 returns map.end() 如果找不到元素。