1.空指针nullptr
- nullptr与NULL的区别:
对于NULL,是一个空指针常量,如果将NULL扩展为常数,那么这个数是0,类型为int。常数0既是整型常量,也是空指针常量,这就有可能导致二义性问题。
因此c++11新标准引入了nullptr,将其作为空指针常量。
2.基于范围的for循环
注意:在试用&时,才可以对元素进行更改
struct A
{
int n;
A(int i) :n(i) {}
};
int main()
{
int ary[] = { 1,2,3,4,5 };
for (int & e : ary)
e *= 10;
for (int e : ary)
cout << e << ","; //10,20.30,40,50
cout << endl;
vector<A> st(ary, ary + 5);
for (auto & it : st)
it.n *= 10;
for (A it : st)
cout << it.n << ","; //100,200,300,400,500
cout << endl;
return 0;
}
3.右值引用和move语义
右值:一般来说,不能取地址的表达式,就是右值,能取地址的,就是左值。
主要目的是提高程序运行的效率,较少需要进行深拷贝的对象进行深拷贝的次数。
4.正则表达式
#include <iostream>
#include <regex> //使用正则表达式须包含此文件
using namespace std;
int main()
{
regex reg("b.?p.*k");
cout << regex_match("bopggk", reg) << endl;//输出 1, 表示匹配成功
cout << regex_match("boopgggk", reg) << endl;//输出 0, 匹配失败
cout << regex_match("b pk", reg) << endl; //输出 1, 表示匹配成功
regex reg2("\\d{3}([a-zA-Z]+).(\\d{2}|N/A)\\s\\1");
string correct = "123Hello N/A Hello";
string incorrect = "123Hello 12 hello";
cout << regex_match(correct, reg2) << endl; //输出 1,匹配成功
cout << regex_match(incorrect, reg2) << endl; //输出 0, 失败
}
5.Lambda表达式
- 只使用一次的函数对象,能否不要专门为其编写一个类?
- 只调用一次的简单函数,能否在调用时才写出其函数体?
形式:
外部变量访问方式说明符 ->返回值类型
{
语句组
}
[] 不使用任何外部变量
[=] 以传值的形式使用所有外部变量
[&] 以引用形式使用所有外部变量
[x, &y] x 以传值形式使用, y 以引用形式使用
[=,&x,&y] x,y 以引用形式使用,其余变量以传值形式使用
[&,x,y] x,y 以传值的形式使用,其余变量以引用形式使用
“->返回值类型”也可以没有, 没有则编译器自动判断返回值类型。
int main()
{
int x = 100, y = 200, z = 300;
cout << [](double a, double b) { return a + b; }(1.2, 2.5)
<< endl;
auto ff = [=, &y, &z](int n) {
cout << x << endl;
y++; z++;
return n*n;
};
cout << ff(15) << endl;
cout << y << "," << z << endl;
int a[4] = { 4,2,11,33 };
sort(a, a + 4, [](int x, int y)->bool { return x % 10
< y % 10; });
for_each(a, a + 4, [](int x) {cout << x << " "; });
}
6.多线程
#include <iostream>
#include <thread>
using namespace std;
struct MyThread {
void operator () () {
while (true)
cout << "IN MYTHREAD\n";
}
};
void my_thread(int x)
{
while (x)
cout << "in my_thread\n";
}
int main()
{
MyThread x; // 对x 的要求:可复制
thread th(x);// 创建线程并执行
thread th1(my_thread, 100);
while (true)
cout << "in main\n";
return 0;
}
/*
输出:
in my_thread
in my_thread
IN MYTHREAD
IN MYTHREAD
in main
in my_thread
IN MYTHREAD
IN MYTHREAD
in main
in main
in my_thread
IN MYTHREAD
…….
*/