cpp中关键字auto的两个实例
Two instances of keyword auto in cpp
第一个是:
map <int,int> m;
//... some elements inserted
auto i= m.begin();
cout<<(*i).first<<(*i).second;
这里需要使用解引用运算符*
第二个:
map <int,int> m;
//... some elements inserted
for(auto i: m)
cout<<i.first<<i.second;
为什么这次我不需要使用 * 运算符?
还有一个疑问:
for(auto &i: m)
这里的“&”有什么区别?
auto i=m.begin()
会给你迭代器..当你想访问值时,它更像一个指针(语法上)访问...
for(auto i:m)
会将 m
(一对)的当前元素复制到 i
中,i
是元素的副本,而不是元素本身...
for (auto &i: m)
将在参考上工作,原始地图受到影响
如以下代码片段所述,第一个 i
是迭代器类型,而 for 循环中的 i
是对类型。
#include <iostream>
#include <map>
int main()
{
std::map <int,int> m;
m[1] = 5;
m[10] = 60;
m[100] = 800;
// Below i is map iterator (std::map<int, int>::iterator)
auto i = m.begin();
std::cout << typeid(i).name() << '\n';
std::cout << (*i).first << " : " << (*i).second << '\n';
std::cout << i->first << " : " << i->second << '\n';
for(auto i: m) {
// Below i is pair<int, int>
std::cout << typeid(i).name() << '\n';
std::cout << i.first << " : " << i.second << '\n';
}
for(auto& i: m) {
// Below i is reference of pair<int, int>)
// modifying this would result in updated values in the map.
std::cout << typeid(i).name() << '\n';
std::cout << i.first << " : " << i.second << '\n';
}
return 0;
}
第一个是:
map <int,int> m;
//... some elements inserted
auto i= m.begin();
cout<<(*i).first<<(*i).second;
这里需要使用解引用运算符*
第二个:
map <int,int> m;
//... some elements inserted
for(auto i: m)
cout<<i.first<<i.second;
为什么这次我不需要使用 * 运算符?
还有一个疑问:
for(auto &i: m)
这里的“&”有什么区别?
auto i=m.begin()
会给你迭代器..当你想访问值时,它更像一个指针(语法上)访问...
for(auto i:m)
会将 m
(一对)的当前元素复制到 i
中,i
是元素的副本,而不是元素本身...
for (auto &i: m)
将在参考上工作,原始地图受到影响
如以下代码片段所述,第一个 i
是迭代器类型,而 for 循环中的 i
是对类型。
#include <iostream>
#include <map>
int main()
{
std::map <int,int> m;
m[1] = 5;
m[10] = 60;
m[100] = 800;
// Below i is map iterator (std::map<int, int>::iterator)
auto i = m.begin();
std::cout << typeid(i).name() << '\n';
std::cout << (*i).first << " : " << (*i).second << '\n';
std::cout << i->first << " : " << i->second << '\n';
for(auto i: m) {
// Below i is pair<int, int>
std::cout << typeid(i).name() << '\n';
std::cout << i.first << " : " << i.second << '\n';
}
for(auto& i: m) {
// Below i is reference of pair<int, int>)
// modifying this would result in updated values in the map.
std::cout << typeid(i).name() << '\n';
std::cout << i.first << " : " << i.second << '\n';
}
return 0;
}