rray(就是个数组array<int, 5>,定义之后长度不可变,因此没有push_back等方法)。 对于内置数组,含有方法begin(), end()的类,如string,和STL容器,可使用for(auto/type x: container)
循环,若要修改x的值,则使用引用for(auto/type &x: container)
。
新增cbegin(), cend(),是begin(), end()的const版本,防止对原容器的元素进行误改等操作。
begin(), end(), 分别指向容器的第一个元素,容器最后一个元素的后面。rbegin(), rend(), 分别指向容器的最后一个元素,容器第一个元素的前面,联合使用达到逆序遍历的效果。crbegin(), crend()是其const版本。
旧版使用嵌套模板时,尖括号要用空格分开,防止与运算符”>>”混淆,vector<list<int> > vec;
C++11不再要求,vector<list<int>> vec;
多线程
新增 线程支持库<thread>, <mutex>, <condition_variable>和<future>
新增 原子操作库
关键字thread_local,静态存储,与每个线程绑定一个,持续性和绑定的线程一致。
Lambda表达式/Lambda函数
lambda函数也叫lambda表达式,就是匿名函数。C++11中,对于接收函数指针或函数符(STL中函数对象)作为参数的函数,可以使用lambda作为参数。
lambda表达式定义的地方和调用的地方在同一个地方,便于调试和修改代码。通常lambda没有名字,也可给lambda指定名称。
auto func = [] (int x) {return x % 3 == 0;}; // 给lambda指定名称func
bool res = func(3);
当lambda函数体只有一条语句时,如只有一条return,可不显式写返回类型,由decltype推断。否则,需要显式写返回类型,采用返回类型后置的格式,如下:
[] (int x) –> int {x = 1; return x % 3;};
lambda捕获方式主要有三种:值捕获、引用捕获和隐式捕获,使lambda函数体内可使用外部所有动态变量。有两种方式传入外部变量,一种是引用&,一种是值=,如果只传特定变量(显式捕获),则传值方式时可省略=(值捕获),传引用方式不可省略&(引用捕获)。传全部的外部变量时(隐式捕获),值方式用“=”标识所有变量,引用方式用“&”。捕获的变量放进 [] 里声明。
[m,&n] (int x) –> int {x = m; return x % 3;}; // 值捕获:m传值,引用捕获:n传引用
[=] (int x) –> int {x = n; return x % 3;}; // 隐式捕获:外部所有变量都通过值方式传递
[&] (int x) –> int {x = n; return x % 3;}; // 隐式捕获:外部所有变量都通过引用方式传递
[=,&n] (int x) –> int {x = n; return x % 3;}; // 表示n以引用方式传递,剩余变量以值方式传递
// 隐式捕获与显式捕获混用时,隐式捕获必须是[]里第一个参数
一些注意事项和详细例子:C++ lambda表达式详细讲解2-隐式捕获与显式捕获-bingma03的博客-CSDN博客