【问题标题】:Vector of static arrays with size determined at run-time大小在运行时确定的静态数组向量
【发布时间】:2017-05-23 06:14:20
【问题描述】:

我希望我的班级成员成为std:array 的向量,但我希望数组大小由班级用户传入的变量确定。这可能吗?我尝试使用初始化列表来执行此操作,但我收到了非常明显的错误消息:

csvParser.cpp:18:35: error: invalid use of non-static data member ‘Parser::featureCount’ std::vector<std::array<lDouble, featureCount> > data;

这是我的尝试:

#include <vector>
#include <array>

typedef long double lDouble;

class Parser {
    const size_t featureCount;
    std::vector<std::array<lDouble, featureCount> > data;
    public:
        Parser(size_t numFeatures) : featureCount(numFeatures) {}
 };

注意:如果可能的话,我希望类的用户能够传入值来确定数组的大小,但我的尝试并不能说明 有什么 完成,我愿意接受任何建议。

【问题讨论】:

  • 会很短,std::array 的大小应该是编译时值
  • 另一方面,如果你愿意使用嵌套容器,为什么不选择vector的vector?
  • 这意味着sizeof(Parser) 会不连贯,因为它的大小会根据data 的类型而有所不同。事实上,它表明Parser 不是一个完全指定的类型,因为它的一个数据成员的类型是未知的。
  • 听起来你想要的是std::vector&lt;std::unique_ptr&lt;T[]&gt;&gt;
  • @Cliff unique_ptr 没有开销,但它不存储分配的长度(因此您可能需要一个额外的变量来保存长度)

标签: c++ arrays vector


【解决方案1】:

std::array 是使用 C 样式数组实现的。这就是为什么您无法在运行时确定大小的原因。 如果你需要一个在运行时改变大小的数组,使用std::vector,或者使用下面的方法。

class Parser
{
private:
    size_t size;
    std::vector<lDouble*> data;

public:
    Parser(const size_t& size)
        : size(size)
    {
        lDouble* arr = new lDouble[size];
        data.push_back(arr);
    }
};

【讨论】:

  • Eww。使用矢量手动管理内存?!?使用std::vector&lt;std::unique_ptr&lt;T[]&gt;&gt; 会更好
猜你喜欢
  • 1970-01-01
  • 2013-12-04
  • 2016-08-15
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 2018-01-24
  • 2018-01-23
  • 2020-10-04
相关资源
最近更新 更多