0

在这个例子中:

#include <iostream>
#include <vector>
#include <string>

typedef std::vector<std::string> vs;

vs test1()
{
  vs strings;
  strings.push_back("a");
  strings.push_back("b");
  strings.push_back("c");
  return strings;
}

void test2(vs& strings)
{
  strings.push_back("a");
  strings.push_back("b");
  strings.push_back("c");
}

int main()
{
  vs data = test1();
  test2(data);
  return 0;
}

我测试了两种填充字符串向量的方法。我认为在第一种情况下我们复制向量,在第二种情况下可能会更好,因为我们只给出向量的 ref。那么有什么好办法,副本对电脑来说成本是不是很大?

谢谢你的回答!

4

2 回答 2

3

为了清楚起见,我建议第一个。NRVO 应该不会对性能产生影响。

如果目的是创建一个新对象并返回它,第一个。如果要修改现有的,请使用第二个。

他们不完全做同样的事情:

int main()
{
  vs data{"test"};
  data = test1();
  //data is {a, b, c}

  vs data2{"test"};
  test2(data2);
  //data is {test, a, b, c}
  return 0;
}
于 2013-10-25T14:52:46.557 回答
2

第一个创建了一个新向量,只有这三个字符串。第二个,将这三个字符串添加到现有向量的末尾。所以,功能有点不同

在性能方面,由于有 (N)RVO 和移动语义,您可以使用第一个更清晰的语义。

于 2013-10-25T14:53:24.930 回答