1. 类型推导 Auto Type
过去的这种冗长的类型声明
std::map<int, std::string>::const_iterator itr = m.find(1);
现在可以写成这样了
auto itr = m.find(1);
编译器会自动推导出正确的类型。字面量也可以:
auto i = 1; // int
auto d = 1.1; // double
auto s = "hi"; // const char*
auto a = { 1, 2 }; // std:: initializer_list<int>
2. 遍历 foreach
在Auto的基础上,终于可以实现for range循环。
关于auto和auto&
使用auto标明一个变量,这个变量永远不会是引用变量。
使用auto&标明一个变量,这个变量有可能被编译器推导为引用变量
数组
在不知道数组容器的大小,非常地方便
int arr[] = {1, 2, 3, 4};
for(auto i : arr) {
std::cout<< i << std::endl;
}
STL容器
新的遍历方式:
for (int i : v) {
cout << i << endl;
}
代码简洁了许多。但是要注意,这里每次循环,会对i
进行一次拷贝。此处i
是一个int
值,拷贝不会造成问题,但是如果是一个class
,我们就更希望用引用的方式进行遍历,一般写成:
vector<string> v = { "a", "b" };
for (auto& s : v) {
cout << s <<" ";
}
输出:
a b
用auto&
即可以变成引用方式遍历,甚至还能在循环中改变它的值。也可以使用const auto&
,只是一般没有必要。
map
map比较特别,返回的是pair变量,不是迭代器
map<string, int> m;
m["one"] = 1;
m["two"] = 2;
for(auto p : m) {
cout << p.first << " ";
cout << p.second << " ";
cout << endl;
}
输出:
one 1
two 2
- 张宇航_Ken 出处:https://www.jianshu.com/p/d0a98e0eb1a8 来源:简书
- Jerry_Jin 出处:https://www.cnblogs.com/jins-note/p/9513129.html 来源:博客园