【问题标题】:Correct way to declare an Array member in a class在类中声明数组成员的正确方法
【发布时间】:2020-05-31 17:50:05
【问题描述】:

我有一个看起来像这样的课程

class StatisticsQuantiles : public StatisticsMC
{
public:
    StatisticsQuantiles(double p_, unsigned long NumberOfPaths);
    virtual void DumpOneResult(double result);
    virtual std::vector<std::vector<double>> GetResultsSoFar() const;
    virtual StatisticsMC* clone() const;
private:
    std::vector<double> ResultList;
    double p;
    unsigned long PathsDone;
};

目前它有一个向量 ResultList,当使用如下值调用函数时,我会在我的类中填充值:

void StatisticsQuantiles::DumpOneResult(double result)
{
    ResultList.push_back(result);
    PathsDone++;
}

现在我知道我会用 NumberOfPaths 个值填充这个向量,所以我想改用一个固定大小的数组。如何获取一个大小为 NumberOfPaths 的数组作为此类的成员?我正在尝试做这样的事情,当然这是行不通的,但你明白了:

class StatisticsQuantiles : public StatisticsMC
{
public:
    StatisticsQuantiles(double p_, const unsigned long NumberOfPaths);
    virtual void DumpOneResult(double result);
    virtual std::vector<std::vector<double>> GetResultsSoFar() const;
    virtual StatisticsMC* clone() const;
private:
    std::array<double, NumberOfPaths> ResultList;
    double p;
    unsigned long PathsDone;
};

【问题讨论】:

  • 你不能那样做;数组的大小必须在编译时知道。
  • 我确实知道大小是多少,我将像这样初始化类:double p = 0.05;const unsigned long NumberOfPaths = 100000;StatisticsQuantiles absQuantileGatherer(p, NumberOfPaths); 但是当我初始化它时如何让我的类知道它?
  • 如果你在编译的时候就知道大小,你可以把它做成一个模板,以大小为参数。只需确保大小是编译时常量(应用 constconstexpr 肝脏)。

标签: c++ arrays class


【解决方案1】:

std::array 的大小必须在编译时知道,这里不是这样。 所以我相信 std::vector 是你的选择。

如果担心 push_back 调整大小的效率,可以在构造函数中保留内存。

ResultList.reserve(NumberOfPaths);

push_back 然后不会重新调整大小,除非您插入超过 NumberOfPaths 元素。所以你没有不必要的调整大小。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多