有如下代码:
std::map<std::string, int> str_int_map;
// ...
for (const std::pair<std::string, int> &item : str_int_map)
{
// ...
}
尽管 item 并非严格意义上的迭代器,但总之是循环因子类似的东西,这段代码有意思的是,尽管指示了引用修饰符,但仍旧不是一段好的代码,原因在于 std::string 执行了复制操作。
为什么呢?
因为 map 的每个元素的类型实际是 std::pair<const std::string, int> , 而非 std::pair<std::string, int> 。由于类型不匹配,所以做了一份拷贝生成出匹配的类型对象。
如果使用 auto ,就会避免这样的问题:
for (const auto &item : str_int_map)
{
//...
}