【问题标题】:std::vector size in header标头中的 std::vector 大小
【发布时间】:2015-03-27 10:06:42
【问题描述】:

我对 std::vector 有一个小问题。在 main.h 我尝试制作固定大小的 int 向量

std::vector<int> foo(7);

但是 g++ 给出了这个错误:

../test/main.h:21:26: error: expected identifier before numeric constant
 std::vector<int> foo(7);
../main/main.h:21:26: error: expected ',' or '...' before numeric constant

如何创建固定大小长度的私有向量变量?或者我应该简单地在构造函数中制作

for(int i=0; i<7;i++){
    foo.push_back(0);
}

【问题讨论】:

  • 如果您想要一个固定大小的向量,请使用 std::array 甚至是裸 C 数组。
  • 在“main.h”中?那可能是错误的地方。

标签: c++ vector std


【解决方案1】:

假设foo 是数据成员,您的语法无效。通常,您可以像这样初始化 T 类型的数据成员:

T foo{ctor_args};

或者这个

T foo = T(ctor_args);

但是,std::vector&lt;int&gt; 有一个构造函数,它采用 std::initializer_list&lt;int&gt;,这意味着第一种形式将产生一个大小为 1 的向量,其中单个元素的值为 7。所以您只能使用第二种形式:

std::vector<int> foo = std::vector<int>(7);

如果您使用的是 C++11 之前的编译器,则需要使用构造函数:

class bar
{
public:
    bar() : foo(7) {}
private:
  std::vector<int> foo;
};

并注意在所有构造函数中初始化向量(如果适用)。

【讨论】:

  • 谢谢。这对我有帮助。我正在使用第二种变体。
  • @juanchopanza 第一个变体不使用初始化列表构造函数吗?
  • @UNIm95 你做得很好,因为第一个在语法上是正确的,但在这种特殊情况下语义上是“错误的”。查看我的编辑。
  • 哦。谢谢。我很幸运能够使用正确的语句。
【解决方案2】:

初始化类成员(除了内置类型)最有效的方法是使用初始化列表。

所以这里最好的解决方案是在类构造函数的初始化列表中构造长度为 7 的向量:

(我还建议您对固定值 7 使用定义。如果您将来将其更改为 8,您将不必更改所有代码上的值 7)

文件.h:

#define YOURCLASSFOOSIZE 7
class yourClass
{
public:
    yourClass(): foo(YOURCLASSFOOSIZE) {}
private:
    std::vector<int> foo;
};

文件.cpp:

for(int i=0; i < YOURCLASSFOOSIZE; i++)
{
    foo.push_back(0);
}

【讨论】:

    猜你喜欢
    • 2012-07-04
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    相关资源
    最近更新 更多