【问题标题】:How to default initilise a std::vector如何默认初始化 std::vector
【发布时间】:2020-01-07 19:11:03
【问题描述】:

尝试默认初始化一个 std::vector

#include <iostream>
#include <vector>
int main()
{    
    class Options
    {
        std::vector<int> items{100};
    } options ;

    std::cout << "Size:" << options.items.size() << " Items[0]:" << options.items[0] << '\n';

    return 0;
 }

这将打印:

尺寸 1:项目[0]:100

但这不是我想要的,我希望向量的大小为 100。

我设法做到了

class Options
{
    std::vector<int> items{ std::vector<int>(100) };
} options ;

但我觉得肯定有“更好”的方法?

问候,

【问题讨论】:

  • @Evg 这对班级成员不起作用
  • 您需要两个 arg 构造函数(大小和值),并且您不能使用花括号(这会给您大括号初始化)
  • C++ 标准{} 构造函数有效地从值列表初始化,您需要() 来调用其他构造函数。

标签: c++ vector stl initialization


【解决方案1】:

在类的主体中初始化类成员的唯一方法是大括号或等号初始化它。这意味着你可以做到

std::vector<int> items{ std::vector<int>(100) };

std::vector<int> items = std::vector<int>(100);

如果你不喜欢这些选项中的任何一个,那么你可以在类构造函数中添加一个初始化器并拥有

class Options
{
    Options() : items(100) {}
    std::vector<int> items;
} options ;

但我个人会改用前两个选项。

【讨论】:

  • @Slava 什么统一初始化? ;) 如果您开始构建您的类型来支持它,那就太好了,不幸的是,在该接口不可能的时候构建的标准类型并非如此。
  • “相当不错”是不够的。它产生的问题多于解决的问题,而且它产生的问题是最糟糕的——当您更改数据类型时,它会默默地改变行为。
  • @NathanOliver 你能详细说明一下吗?如何更改向量以使其更好地使用新语法?
  • @HolyBlackCat 基本上是删除那些构造函数。但是我们不能这样做,所以我们生活在一个没有好的解决方案的世界里。一个“简单”的解决方法是将标签添加到那些无法与初始化列表区分开来的构造函数,这样您仍然可以大括号初始化并使用标签来选择您想要的构造函数。
【解决方案2】:

为了避免由于两者之间的不同行为而造成任何混淆

std::vector<int> items(100);

std::vector<int> items{100};

使用

std::vector<int> items;
items.resize(100);       //Default initializes 100 int <=> zero
// or
items.resize(100, 17);   //Initializes 100 ints with value 17

在构造函数中使用

class Options
{
    std::vector<int> items;

public:
    Options()
    {
        items.resize(100);
    }
} options;

【讨论】:

  • 请注意,这不能使用类内成员初始化器来完成。
【解决方案3】:
class Options
{
    std::vector<int> items;
public: 
    Options() : items(100) {}
}

: 启动成员的列表初始化,在构造函数主体开始之前按照它们在类中声明的顺序构造成员。

【讨论】:

    【解决方案4】:

    如下更改您的代码:

    std::vector<int> items(100,0);
    

    这将创建大小为 100 的向量,并使用值 0 初始化所有向量

    【讨论】:

    • OP 不能把它放在类范围内。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2018-10-17
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    相关资源
    最近更新 更多