在C++11之前,auto关键字用来指定存储期。在新标准中,它的功能变为类型推断。auto现在成了一个类型的占位符,通知编译器去根据初始化代码推断所声明变量的真实类型,这样可以让我们的代码更加简洁。 auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除。前后两个标准的auto,完全是两个概念。
例如:
auto i = 42; // i is an int cout << sizeof(i) <<endl; //4 // l is a long int. auto l = 42L; cout << sizeof(l) <<endl; //8 // ll is a long long int. auto ll = 42LL; cout << sizeof(ll) <<endl; //8 // l is an long long map<string, int> m; m["hello"] = 0; m["world"] = 1; for(auto it = m.begin(); it != m.end(); ++it) cout<< it -> first << " " << it ->second << endl; cout << "------------------------------------------------------------" << endl;
auto还可以作为返回值占位符
auto add(int t1, int t2) { return t1+t2; }
C++11也可以使用类似”foreach”的语法遍历容器。用这个新的写法,可以遍历C类型的数组、初始化列表以及任何重载了非成员的begin()和end()函数的类型。如果你只是想对集合或数组的每个元素做一些操作,而不关心下标、迭代器位置或者元素个数,那么这种for循环迭代将会非常有用。例如上面的map对象:
for(auto it : m) cout<< it.first << " " << it.second << endl;
字符串中有多少标点符号
string s("hello world!!"); auto counter = 0; for (auto c : s) if(ispunct(c)) //#include <cctype> counter++; else if(isalpha(c)) c = toupper(c); cout << "Punction counter is "<< counter << endl; //2 cout << s << endl; //HELLO WORLD!!
参考:
《C++ Primer》
C++11中的自动类型推断和基于范围的for循环 http://blog.csdn.net/huang_xw/article/details/8760403