传值返回,返回它的拷贝,然后再拷贝。代价就大了如何优化:

	void generate(int numRows, vector<vector<int>>& vv) {
		vector<vector<int>> vv(numRows);
		for (int i = 0; i < numRows; ++i)
		{
			vv[i].resize(i + 1, 1);
		}
		for (int i = 2; i < numRows; ++i)
		{
			for (int j = 1; j < i; ++j)
			{
				vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];
			}
		}
	}
};

int main()
{
	vector<vector<int>> ret = Solution().generate(100);
	vector<vector<int>> ret;
	Solution().generate(100, ret);


	return 0;
}

但是用的时候很别扭

这种就很别扭

进化:

编译器优化没有彻底解决问题,及时编译器不优化在C++11语法出来以后,有了移动构造,移动赋值,还是很有效率,实现了彻底解决。

浅拷贝情况下,编译器优化意义又出来了。移动构造,移动赋值加优化就是无敌的存在。

string vector 增加了移动构造移动赋值,

用到代码的地方一点不变,但是效率得到了非常大的优化。

C++11以后所有容器都增加了移动构造移动赋值,

了解一下:意义不是很大,没和实践运用

已经被移动的是泛左值。

当我写一个这样的一个万能引用模版时候,如果传右值就是右值引用版本,左值引用叠加引用折叠就是左值引用,叠加const 要加const 。写一个这样模版可以实例化不同的引用。

C++11针对pushback也增加了右值引用版本

这就意味着效率不一样。

移动构造的效率高,

这是构造+移动构造

将list改一下

这样还是拷贝构造,因为右值有可能继续往下一层传递,又传给insert

insert只有左值版本,那么,左值右值都到这了,所以insert这也要增加右值版本,这不是万能引用。

因为list实例化时候就把这个T确定了,这里insert就不是模版,不存在推的版本

,所以把insert再写个右值版本,还是不行,这里

new的时候还要往下传

构造也要提供个 右值版本,还是不行

因为pushback时候右值引用把x又设计成左值,就调到左值版本insert去了,

就要使用forward完美转发一下,所以要升级除了语法升级,库也要跟着升级,

,就好了

这里两个insert push——back都各有两个很冗余,

我直接写这个,左值引用还是右值引用不知道,这个引用折叠就是为了搞出个引用模版,传左值就是左值引用,右值就推出string,就是string右值引用

insert也是一样

这也要完美转发一下 

但是这样,有些情况没有默认构造可以用,因为这个地方如果折叠以后是个普通的左值引用的话,这个缺省参数给不上去

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐