C++新特性
1 std::swap
原本我们交换两个变量的数据时,通常是以下做法:
int a = 10, b = 20;
// 交换a,b
int tem = a;
a = b;
b = tem;
这在大型数据时,显然做了三次操作,效率非常低,而std::swap函数是直接交换二者的指针,效率非常高,因此在遇到交换两者数据操作时,尽量使用该函数。
2 auto
自动类型推到,该方式不影响编译速度。
3 Lambda表达式
概述
// Lambda表达式的一般形式,返回值类型通常可以省略,如果编译器不能推断,则需要给
[捕获列表](参数列表)->返回类型{函数体}
// 没有参数时,参数列表可以省略,捕获列表和函数体不可省略,如下:
auto fuc = []{std::cout<<"Hello,Lambda"<<std::endl;}
捕获列表
(1)[] 不捕获任何变量
int a = 2;
static int b = 8;
auto fuc1 = []{return a;}; // 会报错,因为无法捕获外部变量
auto fuc2 = []{return b;}; // 不报错,可以捕获静态局部变量
(2)[&] 按引用捕获可见范围内的所有局部变量(不推荐使用)
int a = 2;
auto fuc = [&]{
a = 28;
return a;
};
fuc();
std::cout<<a<<std::endl; // 结果为28,因为是捕获的引用
(3)[=] 捕获可见范围内的所有局部变量,以副本形式(不推荐使用)
int a = 2;
auto fuc = [=] () mutable {
a = 28;
return a;
};
fuc();
std::cout << a << std::endl;
// 因为是副本,结果为2,不加mutable会报错,因为是不加便为const函数
(4)[this] 通常在类中使用, 让 Lambda 表达式拥有和当前类成员同样的访问权限,可以修改类的成员变量,使用类的成员函数。
4 tuple容器
// 1.初始化方法
std::tuple<float, string> t1(2.8, "tuple");
auto t2 = std::make_tuple(28, "Hello");
// 2.拆开tuple,不想要某一个值可以用ignore代替
double a;
string b;
std::tie(a,b) = t1;
std::tie(c, ignore) = t2;
// 3.连接tuple
auto t3 = tuple_cat(t1, t2)
// 4.获取tuple中的信息
auto d = get<0>(t1); //获取第一个元素
std::tuple_element<0, decltype(t2)>::type //获取第一个元素的数据类型
std::tuple_size<decltype(t3)>::value; //获取t3的大小