矢量emplace_back混乱

时间:2014-06-03 13:34:13

标签: c++ c++11

我很好奇这个代码段的输出。

#include <vector>
#include <iostream>

struct base
{
  static int id;
  base() {std::cout << "C" << std::endl; mid = id; id++;}
  //base(const base&) {std::cout << "Co" << std::endl;}
  //base(base &&) {std::cout << "Mo" << std::endl;}
  ~base() {std::cout << "D" << mid << std::endl;}
  int mid;
};

int base::id = 0;

int main()
{
  std::vector<base> v;
  v.emplace_back();
  std::cout << "First" << std::endl;
  v.emplace_back();
  std::cout << "Second" << std::endl;
}

g ++ 4.7.2显示输出

C
First
C
D0
Second
D0
D1

我不明白在第二个“C”之后看到“D0”的原因。另外,为什么在输出中看到“D0”两次?

这种行为是符合C ++ 11标准还是“实施质量”相关方面?

1 个答案:

答案 0 :(得分:2)

vector在添加对象时调整大小。 reserve开头有足够的空间,你会看到你期望的输出。

std::vector<base> v;
v.reserve(2);        // now there's enough capacity to contain at least 2 objects
v.emplace_back();
std::cout << "First" << std::endl;
v.emplace_back();
std::cout << "Second" << std::endl;

输出:

C
First
C
Second
D0
D1

Live demo