【问题标题】:Initializing a std::vector with default constructor使用默认构造函数初始化 std::vector
【发布时间】:2011-03-14 04:10:13
【问题描述】:

我有一个类字段,它是一个 std::vector。我知道我希望这个向量包含多少个元素:N。如何用 N 个元素初始化向量?

【问题讨论】:

  • 你指的是初始的size还是初始的capacity
  • @Emile。我猜是初始大小。我不太明白。你是指使用reserve()来预留容量吗?
  • 是的,我是。让我换一种说法:你是希望你的向量最初有 N 个元素,还是希望你的向量能够在不重新分配的情况下增长到 N 个元素?
  • @Emile。最初有 N 个元素,下面 James 和 Jerry 的答案正是我想要的。

标签: c++ c++-standard-library


【解决方案1】:

std::vector 有一个构造函数声明为:

vector(size_type N, const T& x = T());

您可以使用它来构造包含Nx 副本的std::vectorx 的默认值是初始化 T 的值(如果 T 是具有默认构造函数的类类型,则值初始化是默认构造)。

使用此构造函数初始化 std::vector 数据成员很简单:

struct S {
    std::vector<int> x;
    S() : x(15) { }
} 

【讨论】:

  • 您已经提到了 N 个元素是复制构造的。我认为没有办法以默认构造元素的方式创建向量(这是我解释问题标题的方式),尽管在 C++0x 中可以使用 emplace_back 在构造后完成.
  • @Ben:嗯,这里默认构造一个元素 :-)。在C++0x中,我提到的构造函数实际上是两个构造函数:vector(size_type N)vector(size_type N, const T&amp; x)。第一个值初始化N 元素并且不调用任何复制构造函数。 resize 函数同样被拆分为两个重载。
  • 该参数是默认构造的,但它根本不是向量元素。很高兴知道在 C++0x 中现在有两个实现而不是默认参数。
【解决方案2】:
class myclass {
   std::vector<whatever> elements;
public:
   myclass() : elements(N) {}
};

【讨论】:

    【解决方案3】:

    所有允许您指定大小的构造函数也会调用元素的构造函数。如果效率是最重要的,您可以使用reserve() 成员函数来保留大小。这实际上不会创建任何元素,因此它更有效。不过,在大多数情况下,通过向量构造函数提供大小就可以了。

    【讨论】:

      猜你喜欢
      • 2020-05-05
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 2016-05-07
      • 2015-08-05
      • 1970-01-01
      • 2020-10-28
      相关资源
      最近更新 更多