【问题标题】:is there a way in c++ to inititialize an array of some class objects without defining the size firstc++中有没有办法在不先定义大小的情况下初始化一些类对象的数组
【发布时间】:2011-09-14 11:41:24
【问题描述】:

我使用这样的代码:

const vector<filterStat> someArray={
        {"Ana",1},
        {"Bob",2},
        {"Charlie",5},
};
static const int knElements=filterStats.size();

忽略 kn 前缀,这是我所说的常量,大小。 我发现它很有用,因为当我更改向量的初始化时,我不必更改或计算 knElements。但问题是使用 const 向量让我很困扰,因为向量是可调整大小的数组,所以感觉不对。顺便说一句,如果你想知道我为什么需要它——长篇大论,它是一种地图,但我不做任何搜索或插入,只是“为每个”做,所以数组是最好的选择。

编辑: 我把我的鳕鱼改成了这个,它编译:

const   filterStat filterStats[]={
//...
};

static const int knFilterStats=sizeof(filterStats)/sizeof(filterStats[0]);
static_assert(sizeof(filterStats),"Can't run statistics-no filterStats exists");

我不知道你可以在 C++ 中做 []。对不起,愚蠢的问题,我希望它可以帮助别人。

【问题讨论】:

  • 原始代码更好,恕我直言。
  • 我知道并且我同意,但问题是它是一个相对经常被称为想要的高性能应用程序的一部分,所以我更喜欢这样使用它。顺便说一句,当我考虑基于范围的 for 循环时,knFilterStats 是不必要的。 :) 我只是不知道它是否和普通的速度一样。
  • 您的新代码的问题是您将不得不将数组的大小与数组一起传递。您不必使用矢量来执行此操作。
  • @Neil:旧代码的特定目的是使用vector 传递大小。也许这是不必要的,但考虑到为 filterStats.size 创建单独变量的决定,该数组似乎是合理的。
  • 如果您发现自己花时间考虑这样的决定,最好只是尝试两种方法并在对照实验中进行测量。通常数组索引样式被优化为指针递增样式,而不是相反,尽管它可以依赖。

标签: c++ arrays c++11


【解决方案1】:

您正在寻找std::array:

const std::array<filterStat, 3> = {
    {"Ana",1},
    {"Bob",2},
    {"Charlie",5},
};

但是,您必须指定大小。

【讨论】:

  • 或者你可以使用 make_array 助手 like this one 并且只写 `const auto X = make_array({"Ana",1}, {"Bob",2}, {"Charlie" ,5});".
  • @Kerrek :如果他使用 MSVC 则不会;-[
【解决方案2】:

拥有 const 向量是一件非常好的事情 - 您的代码是做事的正确方式。

【讨论】:

    猜你喜欢
    • 2013-12-02
    • 2015-08-10
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多