1、类型说明符auto
•和只对应一种特定类型的说明符(int、double等)不同,auto用于从初始化表达式中推断出变量的数据类型。因此,auto定义的变量必须有初始值。
3、空指针nullptr
•nullptr是为了解决原来C++标准中NULL的二义性问题而引进的一种新的类型,因为NULL实际上代表的是0。
4、基于范围的for循环
•基于范围(range-based)的for循环:简化了常见的循环,对数组或容器类等的每个元素执行相同的操作(VS2010目前不支持)。
6、虚函数的override和final指示符
•override,表示函数应当重写基类中的虚函数(VS2010目前支持)。
•final,表示派生类不应当重写这个虚函数(VS2010目前不支持)。
10、匿名函数
•匿名函数,又称为Lambda函数(也叫Lambda表达式)。
•Lambda表达式具体形式如下:
•[capture](parameters)->return-type{body}
[ capture ] ( params ) mutable exception attribute -> ret { body } (1)
[ capture ] ( params ) -> ret { body } (2)
[ capture ] ( params ) { body } (3)
[ capture ] { body } (4)
其中
(1) 是完整的 lambda 表达式形式,
(2) const 类型的 lambda 表达式,该类型的表达式不能改捕获("capture")列表中的值。
(3)省略了返回值类型的 lambda 表达式,但是该 lambda 表达式的返回类型可以按照下列规则推演出来: 如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。 如果没有 return 语句,则类似 void f(...) 函数。 省略了参数列表,类似于无参函数 f()。
[] // 不引用外部变量
[x, &y] // x引用方式 ,y 传值
[&] // 任何使用的外部变量都是引用方式。
[=] // 任何被使用到的外部都是传值方式。
[&, x] // 除x传值以外其他的都以引用方式。
[=, &z] // 除z引用以外其他的都是以传值方式使用。
int main()
{
std::vector<int> c { 1,2,3,4,5,6,7 };
int x = 5;
c.erase(std::remove_if(c.begin(), c.end(), [x](int n) { return n < x; } ), c.end());
std::cout << "c: ";
for (auto i: c) {
std::cout << i << ' ';
}
std::cout << '\n';
// 可以用auto 接收一个lambda 表达式。
auto func1 = [](int i) { return i+4; };
std::cout << "func1: " << func1(6) << '\n';
// std::function 也可以接收lambda 表达式。
std::function<int(int)> func2 = [](int i) { return i+4; };
std::cout << "func2: " << func2(6) << '\n';
std::function<int()> func3 = [x]{return x;};
std::cout << "func3: " << func3() << '\n';
std::vector<int> someList = {1,2,3}; //这里是c++11
int total = 0;
double sum = 0.0f;
std::for_each(someList.begin(), someList.end(), [&total](int x) { total += x; });
std::cout << total << '\n';
std::for_each(someList.begin(), someList.end(), [&](int x){ total += x; sum += x;});
std::cout << total << '\n';
std::cout << sum << '\n';
//再写一种简单的lambda
[](){std::cout<<"就地展开的lambda\n";}();
}
auto与for配合使用
std::map<std::string, std::vector<int>> map;
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
map["one"] = v;
for(const auto& kvp : map)
{
std::cout << kvp.first << std::endl;
for(auto v : kvp.second)
{
std::cout << v << std::endl;
}
}
int arr[] = {1,2,3,4,5};
for(int& e : arr)
{
e = e*e;
}