0%

C++ Notes

some notes about cpp # 遍历map容器 ## c++98

1
2
3
4
5
map<string, int>::iterator it;
for (it = m2.begin(); it != m2.end(); it++) {
string s = it->first;
printf("%s %d\n", s.data(), it->second);
}
## c++11
1
2
3
for(auto it : map1){
cout << it.first <<" "<< it.second <<endl;
}
## c++17
1
2
3
for (auto& [k, v] : map1) {
std::cout << k << " " << v << std::endl;
}

sort函数

1
sort(a.begin(),a.end(),std::greater<int>())

Lambda(匿名函数)

c++11新特性

语法:

image-20240709004856410

按照上图中的标号,具体解释如下:

标号1:指定捕获列表,所谓捕获,是把Lambda表达式之外定义的变量,捕获到Lambda表达式内部,这样Lambda内部可以直接引用这些变量,省去参数传递的过程。

捕获分为两种方式:

  • 按值捕获,捕获到Lambda表达式内部的变量是副本,注意,按值捕获的变量默认是不能修改的,可以使用mutable关键字突破这个限制,见下文标号3.
  • 按引用捕获,捕获到Lambda表达式内部的变量是引用,修改变量会影响外部的同名变量

捕获的举例如下:

  • [],空捕获列表,不捕获任何变量,此时引用外部变量则会提示编译错误
  • [=],默认按值捕获全部变量
  • [&],默认按引用捕获全部变量
  • [=,&x,&y],默认按值捕获全部变量,但是变量x,变量y按引用捕获
  • [&,=x,=y],默认按引用捕获全部变量,但是变量x,变量y按值捕获
  • [&,x,y],效果同上,即变量名前面没有写=或者&时,默认为按值捕获
  • [=,x,y],编译出错,变量x,变量y按值捕获,和默认按值捕获全部变量重复
  • [x,y],只按值捕获变量x和变量y
  • [&x,&y],只按引用捕获变量x和变量y
  • [x,&y],只按值捕获变量x,按引用捕获变量y
  • [=x,=y],编译出错,应为[x,y]
  • [this],捕获this指针,然后在Lambda表达式内部就可以直接引用类成员了

标号2:函数参数

用法和普通函数一样

标号3:mutable,用来突破不能修改按值捕获变量的限制

如下代码,按值捕获了变量x,在Lambda表达式内部,是不能修改x的值的

1
2
int x = 1;
auto f=\[x\](){x++;};// 编译错误,不能修改x的值f();

为了突破上面的限制,添加mutable即可编译成功

1
2
int x = 1;
auto f=\[x\]()mutable{x++;};// 编译成功f();

注意,即使Lambda表达式内部修改了x的值,但是依旧不影响Lambda表达式外部的x的值,两者是相互独立的。

标号4:throw关键字,和C++中throw用法保持一致

标号5:Lambda表达式返回值的类型

标号6:函数内容;注意函数最后面,需要添加一个;

lambda的实质