在C++中是否有一种方法可以初始化某个类的对象数组而无需先定义其大小?

3
我使用以下代码:

我使用这样的代码:

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

请忽略 kn 前缀,这是我的一种表示常量大小的方法。

我发现这很有用,因为当我更改向量的初始化时,我不必更改或计算 knElements 的值。但问题在于使用 const vector 会让我感到困扰,因为 vector 是可调整大小的数组,所以这样做感觉不对。顺便说一下,如果你想知道为什么我需要它,那是一个长故事,它有点像一个映射,但我不搜索或插入任何内容,只是“对于每个”操作,所以数组是最好的选择。

编辑:

我将我的代码更改为以下内容,并成功编译:

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

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

我不知道在c++中可以做[]。抱歉问了一个愚蠢的问题,希望能帮助到别人。


1
在我看来,原始代码更好。 - user2100815
我知道并同意,但问题在于它是所谓的“想要高性能应用程序”中相对频繁调用的部分,因此我更喜欢以这种方式使用它。顺便说一句,当我考虑range based for循环时,knFilterStats是不必要的。 :) 我只是不知道它是否与常规for循环速度相同。 - NoSenseEtAl
1
你的新代码问题在于你必须将数组的大小与数组一起传递。使用向量就不需要这样做了。 - user2100815
1
@Neil:旧代码的特定目的是将大小与“vector”一起传递。也许这是不必要的,但考虑到为filterStats.size创建单独变量的决定,数组似乎是合理的选择。 - Potatoswatter
1
如果你发现自己花时间思考这样的决定,最好的方法是尝试两种方式并进行控制实验测量。通常,数组索引风格被优化为指针增量风格,而不是相反,尽管这可能因情况而异。 - Potatoswatter
2个回答

5

您正在寻找std :: array

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

然而,您必须指定大小。


或者您可以使用 make_array 助手像这样,只需编写 const auto X = make_array({"Ana",1}, {"Bob",2}, {"Charlie",5}); - Kerrek SB
@Kerrek:如果他在使用MSVC,那就不行了;-[ - ildjarn

2

一个const向量是非常好的东西 - 您的代码做事情的方式是正确的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接