C++11 无序映射迭代器返回已擦除的键,为什么以及如何跳过它们 我对C++编程很陌生,遇到了一个让我困惑和使我的代码更难编写的行为。我已经搜索了一点,找不到任何东西——我也滚动过C++参考页面,也没有帮助(请不要把我钉在十字架上,如果答案在那里——页面不是解释事物的角色模型)。也许我错过了一些非常明显的东西

C++11 无序映射迭代器返回已擦除的键,为什么以及如何跳过它们 我对C++编程很陌生,遇到了一个让我困惑和使我的代码更难编写的行为。我已经搜索了一点,找不到任何东西——我也滚动过C++参考页面,也没有帮助(请不要把我钉在十字架上,如果答案在那里——页面不是解释事物的角色模型)。也许我错过了一些非常明显的东西,c++11,iterator,key,unordered-map,C++11,Iterator,Key,Unordered Map,有人能解释一下std::无序地图的以下行为吗 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::无序地图的以下行为吗

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!?
std::无序映射测试映射;
test_map[“test_key_1”]=“test_value_1”;
test_map[“test_key_2”]=“test_value_2”;
std::cout用于访问以前删除的元素,这些元素

返回对映射到与键等效的键的值的引用,如果该键不存在,则执行插入

如果您只需要搜索给定的键,请使用在未找到元素时返回
map.end()
的方法。

您正在使用该方法访问以前删除的元素,这些元素

返回对映射到与键等效的键的值的引用,如果该键不存在,则执行插入


若您只需要搜索给定的键,若找不到元素,请使用返回
map.end()
的方法。

非常感谢!我已经在我的代码中处理了几个小时了!谢谢!我已经在我的代码中处理了几个小时了!