如何避免在向量中调用元素的复制构造函数

时间:2017-04-28 11:44:28

标签: c++ c++11 vector constructor stl

在下面的C ++示例中:

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

using namespace std;

struct foo{
  foo(int i) : s( to_string(i) ){ cout << "init foo : "+s+"\n"; }
  foo(foo&& f) : s( move(f.s) ){ cout << "move foo : "+s+"\n"; }
  foo(const foo& f) : s(f.s){ cout << "copy foo : "+s+"\n"; }
  string s;
};

int main(){
  vector<foo> f;
  for(int i=0; i<5; i++){
    cout << f.size() << endl;
    f.push_back( foo(i) );
  }
}

输出结果为:

0
init foo : 0
move foo : 0
1
init foo : 1
move foo : 1
copy foo : 0
2
init foo : 2
move foo : 2
copy foo : 0
copy foo : 1
3
init foo : 3
move foo : 3
4
init foo : 4
move foo : 4
copy foo : 0
copy foo : 1
copy foo : 2
copy foo : 3

每次更改std::vector时,foo似乎都会为容器中的所有capacity元素调用复制构造函数。

有没有办法强制使用移动构造函数而不是复制构造函数?

我不知道vector的最终尺寸,因此vector::reserve不是可能的选择。

1 个答案:

答案 0 :(得分:2)

你需要说明你的移动构造函数不会抛出

foo(foo&& f) noexcept  : s(move(f.s)) { cout << "move foo : " + s + "\n"; }