【问题标题】:Vector allocation when declaring struct声明结构时的向量分配
【发布时间】:2013-01-18 10:16:34
【问题描述】:

您可以创建一个包含数组的 C++ 结构:

struct foo{
    int bar[42];
};

我想做的是:

struct foo{
    std::vector<int> bar(42);
};

当然这不会编译,但你明白了。我知道 .reserve() 之类的, 但我希望在声明foo 时已经分配了空间。

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

感谢您的建议。

【问题讨论】:

  • 如果我理解您的问题,您想用 std::vector 替换数组,但仍希望进行静态内存分配(即在编译时分配资源)。据我所知,std::vector 动态分配资源,这意味着下面使用构造函数的答案将在运行时分配内存。

标签: c++ vector struct


【解决方案1】:

使用构造函数:

struct foo{
    std::vector<int> bar;
    foo() : bar(32) {}
};

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

【讨论】:

    【解决方案2】:

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

    struct foo {
        foo() : bar(42) {}
        std::vector<int> bar;
    };
    

    如果您的编译器支持 C++11 功能,请改用std::array&lt;&gt;。

    struct foo {
        std::array<int, 42> bar;
    };
    

    或boost::array&lt;&gt;,如果 C++11 不可用且允许提升。

    【讨论】:

    • 可能值得一提的是,C++11 还允许在声明点进行初始化。
    【解决方案3】:

    现有的答案已经解释了如何做你想做的事,但我认为他们错过了解释原因的重要部分。您需要掌握的是,C++ 中的 struct 只是 class 的近义词,唯一的区别是结构默认具有公共成员,而类默认具有私人的。您可以用

    替换代码中class 的每个实例
    struct X
    {
        private:
        ...
    }
    

    它的工作原理完全相同,反之亦然用class替换structs。这意味着就像您使用构造函数对类执行所需的操作一样,您可以在结构中使用构造函数:

    struct foo
    {
        std::vector<int> bar;
        foo() : bar(42) {}
    }
    

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

    【讨论】:

      【解决方案4】:

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

      像这样:

      struct foo{
          foo() : bar(42) {}
          std::vector<int> bar;
      };
      

      【讨论】:

        【解决方案5】:

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

        1. 空间将“已经分配”在定义之后(在使用构造函数的情况下);
        2. 永远不要使用 .reserve(),只能使用 .resize()(在了解差异之前);
        3. 您可以在声明后安全地调用 .resize() 并且几乎没有开销(而不是使用构造函数)。 但无论如何,学习和使用构造函数。

        【讨论】:

        • 1 是什么意思?声明不分配任何内存。另外,您的意思是“从不使用reserve()”?为什么不?还有,3)错了,应该优先使用初始化列表。
        • 1) 他说“我希望在声明时已经分配了空间”,我只是固定的话; 2)他不知道构造函数,你认为他会正确使用 .reserve() 吗? 3)我知道并附加它以立即回答
        • 您误解了“声明”的含义。一个类声明是struct foo。他所拥有的是一个定义。既不分配内存。我并不是说他知道储备的作用,但“永远不要使用储备”是个坏建议。一个好的建议是“了解储备的作用”。绝对不是“从不做”。 3) 同样,您误解了“声明”的含义。
        • 永远不要使用reserve,这让我觉得这是个坏建议。
        • 1.我没有说他写了有问题的声明。我说的是声明,是的,他没有写有问题但会用代码写的声明。他的话意味着在对象构造之前分配了一些内存,这没有意义,我修复了WORDS。 2. 从第二行读到行尾。用心。 3. 第三,我写信是为了澄清这种方法也适用于他的代码。我建议他使用构造函数,但他的情况允许不要学习构造函数。
        猜你喜欢
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-14
        • 2020-06-20
        • 2017-04-05
        • 2016-07-14
        • 1970-01-01
        相关资源
        最近更新 更多