C++基于范围for循环迭代器与map::find()迭代器的区别
问题解答
核心区别:循环变量的类型本质不同
你看到的两种写法,根本差异在于循环变量的类型,而非迭代器本身:
- 范围for循环里的
auto i,不是迭代器,它是map中元素的副本(类型为std::pair<const int, int>)。如果写成auto& i : m,就是元素的引用,能避免不必要的拷贝。 m.begin()/m.end()、m.find()返回的是map的迭代器对象(类型为std::map<int, int>::iterator),这个迭代器是一个指向map元素(pair对象)的"指针式对象"。
为什么运算符使用不同?
运算符的选择完全取决于你操作的对象类型:
范围for循环用
.运算符:
因为i是std::pair<const int, int>类型的对象(或引用),直接访问对象的成员变量,就用.运算符。比如示例里i.first就是访问这个pair的第一个成员。普通迭代器用
->运算符:
迭代器本身不是pair对象,它是指向pair对象的"包装指针"。->运算符是C++为迭代器提供的语法糖,等价于先解引用迭代器得到pair对象,再用.访问成员:// 下面两行完全等价 cout << i->first << endl; cout << (*i).first << endl;
补充:map::find()返回的迭代器用法示例
map::find()返回的迭代器和m.begin()返回的迭代器是同一类型,用法完全一致:
std::map<int, int> m = {{1, 10}, {2, 20}}; auto it = m.find(1); if (it != m.end()) { // 用->访问成员 std::cout << it->first << ": " << it->second << std::endl; // 或者解引用后用. std::cout << (*it).first << ": " << (*it).second << std::endl; }
额外提示:范围for循环的最佳实践
如果不需要修改元素,建议用const auto& i : m;如果需要修改,用auto& i : m,这样可以避免拷贝map中pair对象带来的性能开销。
内容的提问来源于stack exchange,提问作者lkumarx
相关产品推荐
相关产品推荐

