3

假设我有很大的多级向量。(这只是多级包含对象树的示例)

vector<vector<vector<int>>> vec1 = getBigVector();

如果我需要传递一个元素,我认为它会导致某种复制。

vector<vector<int>> vec2 = vec1[2];
vector<vector<int>> vec3 = vec1[3];

看起来并不比引用更有效。据我所知,通常选择 C++ 是因为它的效率,而且我听说 C++ 被设计为更喜欢值类型对象。但是,对于具有许多元素的容器来说仍然如此吗?容器包含另一个容器怎么样?

有没有什么隐藏的秘密可以让操作变得高效?或者我应该只是引用它而不是复制它?

更新

整个对象树需要频繁的变异。甚至树本身也需要变异。

4

1 回答 1

3

一般来说,是的,使用参考而不是副本。如果您不需要复制整个对象(如果引用也可以),请使用引用。

但是,有时您只想移动或重命名现有对象。对于这种情况,您可以使用该std::move函数(C++11 中的新功能),它基本上告诉 STL,如果这有助于更快地创建新对象,则可以丢弃旧对象。

例子:

vector<vector<int>> vec2 = vec1[2];

意思是“创建一个全新的对象,所以现在有两个对象。” 这是非常缓慢的。

vector<vector<int>> &vec2 = vec1[2];

意思是“仍然只有一个对象,但现在有两个对它的引用。” 这是最快的选择。

vector<vector<int>> vec2 = std::move(vec1[2]);  // C++11

意思是“有两个物体,但vec2偷了 的内脏vec1[2],所以vec1[2]只是一个空壳。” 这通常也是一个非常快的操作,当然,虽然不如创建引用那么快。vec1[2]在它被std::move淘汰后尝试做任何事情是错误的;您唯一可以合法做的就是调用它的析构函数。

有关 C++11 的更多信息,请std::move参阅 Google“右值引用”。

于 2013-03-02T08:32:27.727 回答