c++ - vector emplace_back 困惑

标签 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 标准还是与“实现质量”相关?

最佳答案

vector 在您添加对象时调整大小。 在开头保留足够的空间,您将看到您期望的输出。

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

关于c++ - vector emplace_back 困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24016590/

相关文章:

c++ - 文件输入和指针所有权语义

c++ - 为什么 snprintf 在打印单个数字时始终比 ostringstream 快 2 倍?

c++ - 如何从 C++ 程序中打开进程并将结果读入 ifstream?

c++ - 通过使用特征在模板类的编译时抛出错误来禁用函数

c++ - 获取卷列表总是说 C :\

C++如何扩展/因式分解方程(不求解)

c++ - 声明一个函数 virtual 会减慢它的速度;备择方案?

c++ - vector 修改后引用 vector.back() 的奇怪行为

c++ - 如果我在 lambda 函数中使用 [this] 而不是 [=] 是否有任何性能提升?

c++ - 为什么 lexical_cast 要求运算符>>位于匹配的 namespace 中?