Interview_C++_day17

(lambda) 表达式

(lambda) 表达式定义一个匿名函数,并且可以捕获一定范围内的变量,基本格式如下:

[capture](params) mutable ->ReturnType {statement}
  • ([capture]):捕获列表,可以捕获上下文的变量来供 (lambda) 函数使用
    • ([var]):值传递的方式捕获 (var)
    • ([&var]):引用传递的方式捕获 (var)
    • ([=]):值传递的方式捕获父作用域的所有变量。
    • ([&]):引用传递的方式捕获父作用域的所有变量。
    • ([this]):值传递的方式捕获当前 (this) 指针。
  • ((params)):参数列表,和普通函数参数列表一致,如果不传参数可以和 (()) 一起忽略。
  • (mutable) 修饰符号,默认情况下,(lambda) 表达式是一个 (const) 函数,可以用 (mutable) 取消他的常量性。若使用 (mutable) 修饰,参数列表不可省略。
  • ->(ReturnType):返回值类型。若是 (void),可以省略。
  • ({statement}):函数主体,和普通函数一样。

(lambda) 表达式优点在于代码简洁,容易进行并行计算。缺点在于在非并行计算中,效率未必有 (for) 循环快,并且不容易调试,对于没学过的程序员来说可读性差。

#include<bits/stdc++.h>
using namespace std;

int main() {
    vector<int> g{9, 2, 1, 2, 5, 6, 2};
    int ans = 1;
    sort(g.begin(), g.end(), [](int a, int b) ->bool{return a>b;});
    for_each(g.begin(), g.end(), [&ans](int x){cout << x << " ", ans = ans*x;});
    cout << "
mul = " << ans << endl;
    return 0;
}
/*
9 6 5 2 2 2 1
mul = 2160
*/

存在全局变量和局部变量时,访问全局变量

可以通过全局作用符号 (::) 来完成

int a = 10;

int main() {
	// freopen("in", "r", stdin);
	int a = 20;
	cout << a << endl;
	cout << ::a << endl;
	return 0;
}

全局变量的初始化的顺序

同一文件中的全局变量按照声明顺序,不同文件之间的全局变量初始化顺序不确定。

如果要保证初始化次序的话,需要通过在函数使用静态局部变量并返回来实现。

class FileSystem{...};
FileSystem & tfs(){
	static FileSystem fs;//定义并初始化一个static对象
	return fs;
}

浅拷贝和深拷贝

  • 浅拷贝:源对象和拷贝对象共用一份实体,仅仅是引用的变量名不同。对其中任意一个修改,都会影响另一个对象。
  • 深拷贝:源对象和拷贝对象相互独立。对其中一个对象修改,不会影响另一个对象。
  • 两个对象指向同块内存,当析构函数释放内存时,会引起错误。

从这个例子可以看出,(b) 通过默认拷贝函数进行初始化,然而进行的是浅拷贝,导致对 (a) 进行修改的时候,(b) 的存储值也被修改。

struct Node {
	char* s;
	Node(char *str) {
		s = new char[100];
		strcpy(s, str);
	}
	/*	手动实现拷贝构造函数
	Node(const Node &other) {
		s = new char[100];
		strcpy(s, other.s);
	}
	*/
};

int main() {
	// freopen("in", "r", stdin);
	Node a("hello");
	Node b(a);
	cout << b.s << endl;
	strcpy(a.s, "bad copy");
	cout << b.s << endl;
	return 0;
}

正确的写法应该自己写一个拷贝函数,而不是用默认的,应该尽量的避免浅拷贝。

原文地址:https://www.cnblogs.com/Jiaaaaaaaqi/p/12363225.html