C++ 声明结构时的向量分配

C++ 声明结构时的向量分配,c++,vector,struct,C++,Vector,Struct,可以在以下的数组中创建一个C++结构: struct foo{ int bar[42]; }; 我想做的是: struct foo{ std::vector<int> bar(42); }; structfoo{ 标准:向量条(42); }; 当然,这不会编译,但您可以理解它的意图。我知道.reserve()之类的, 但是我希望在声明foo时已经分配了空间 原因是我要修改一个相当复杂的Perl脚本,该脚本在结构中使用数组生成C代码。这些数组应替换为std::ve

可以在以下的数组中创建一个C++结构:

struct foo{
    int bar[42];
};
我想做的是:

struct foo{
    std::vector<int> bar(42);
};
structfoo{
标准:向量条(42);
};
当然,这不会编译,但您可以理解它的意图。我知道.reserve()之类的, 但是我希望在声明
foo
时已经分配了空间

原因是我要修改一个相当复杂的Perl脚本,该脚本在结构中使用数组生成C代码。这些数组应替换为
std::vector
s。脚本随后根据XML文件初始化数组,我不想在脚本中乱用
push_back
,因为结构是深度嵌套的(数组的结构和结构的数组)。阵列的大小当然会有所不同


谢谢你的建议

您应该在结构的构造函数中(最好在其初始化列表中)设置向量的大小(即调用
std::vector
的构造函数)

像这样:

struct foo{
    foo() : bar(42) {}
    std::vector<int> bar;
};
structfoo{
foo():bar(42){}
向量条;
};

您应该在结构的构造函数中(最好在其初始化列表中)设置向量的大小(即调用
std::vector
的构造函数)

像这样:

struct foo{
    foo() : bar(42) {}
    std::vector<int> bar;
};
structfoo{
foo():bar(42){}
向量条;
};
使用构造函数:

struct foo{
    std::vector<int> bar;
    foo() : bar(32) {}
};
structfoo{
向量条;
foo():bar(32){}
};
创建实例时,将自动分配向量的内存。初始化列表在构造函数主体执行之前初始化成员。

使用构造函数:

struct foo{
    std::vector<int> bar;
    foo() : bar(32) {}
};
structfoo{
向量条;
foo():bar(32){}
};

创建实例时,将自动分配向量的内存。初始化列表在构造函数主体执行之前初始化成员。

添加构造函数并使用初始化列表:

struct foo {
    foo() : bar(42) {}
    std::vector<int> bar;
};
structfoo{
foo():bar(42){}
向量条;
};
如果编译器支持C++11功能,请改用

structfoo{
std::数组条;
};

或者如果C++11不可用且允许使用boost。

添加构造函数并使用初始值设定项列表:

struct foo {
    foo() : bar(42) {}
    std::vector<int> bar;
};
structfoo{
foo():bar(42){}
向量条;
};
如果编译器支持C++11功能,请改用

structfoo{
std::数组条;
};

或者如果C++11不可用并且允许使用boost。

使用构造函数,如其他答案中所建议的。但我必须纠正你:

  • 定义后空间将“已分配”(如果使用构造函数)
  • 永远不要使用.reserve(),只使用.resize()(在理解差异之前)
  • 您可以在声明后安全地调用.resize(),几乎没有开销(而不是使用构造函数)但无论如何,要学习并使用构造函数。

  • 按照其他答案中的建议,使用构造函数。但我必须纠正你:

  • 定义后空间将“已分配”(如果使用构造函数)
  • 永远不要使用.reserve(),只使用.resize()(在理解差异之前)
  • 您可以在声明后安全地调用.resize(),几乎没有开销(而不是使用构造函数)但无论如何,要学习并使用构造函数。

  • 现有的答案已经解释了如何做你想做的事情,但我认为他们忽略了解释原因的重要部分。你需要掌握的是C++中的<>代码> Stult<代码>只是一个近乎同义词,用于<代码>类< /> >,唯一的不同在于,结构默认有公共成员,默认的类具有私有。您可以将代码中
    的每个实例替换为

    struct X
    {
        private:
        ...
    }
    
    class
    替换
    structs
    时,它的工作原理完全相同,反之亦然。这意味着,正如使用构造函数对类执行所需的操作一样,在结构中使用构造函数:

    struct foo
    {
        std::vector<int> bar;
        foo() : bar(42) {}
    }
    
    structfoo
    {
    向量条;
    foo():bar(42){}
    }
    

    这对于
    std::vector
    ,顺便说一句,还需要几个参数,第二个参数是填充向量的值,这样你就可以用
    foo():bar(42,-1){}
    来填充向量的值
    -1

    ,现有的答案已经解释了如何做你想做的事情,但我认为他们忽略了解释原因的重要部分。你需要掌握的是C++中的<>代码> Stult<代码>只是一个近乎同义词,用于<代码>类< /> >,唯一的不同在于,结构默认有公共成员,默认的类具有私有。您可以将代码中
    的每个实例替换为

    struct X
    {
        private:
        ...
    }
    
    class
    替换
    structs
    时,它的工作原理完全相同,反之亦然。这意味着,正如使用构造函数对类执行所需的操作一样,在结构中使用构造函数:

    struct foo
    {
        std::vector<int> bar;
        foo() : bar(42) {}
    }
    
    structfoo
    {
    向量条;
    foo():bar(42){}
    }
    

    这对于
    std::vector
    ,顺便说一句,还需要两个参数,第二个参数是填充向量的值,因此如果我理解你的问题,你可以使用
    foo():bar(42,-1){}
    填充向量的值,您希望用std::vector替换数组,但仍然希望进行静态内存分配(即在编译时分配资源)。据我所知,std::vector动态分配资源,这意味着下面使用构造函数说明的答案将在运行时分配内存。如果我理解您的问题,您希望用std::vector替换数组,但仍然希望进行静态内存分配(即在编译时分配资源)。据我所知,std::vector分配资源