如何默认初始化 std::vector
Posted
技术标签:
【中文标题】如何默认初始化 std::vector【英文标题】:How to default initilise a std::vector 【发布时间】:2020-01-07 19:11:03 【问题描述】:尝试默认初始化一个 std::vector
#include <iostream>
#include <vector>
int main()
class Options
std::vector<int> items100;
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++ 标准
构造函数有效地从值列表初始化,您需要()
来调用其他构造函数。
【参考方案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> items100;
使用
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 不能把它放在类范围内。以上是关于如何默认初始化 std::vector的主要内容,如果未能解决你的问题,请参考以下文章
如何在初始化中将 'std::vector<double>' 转换为 'double'
如何使用 std::vector 初始化 boost::random::discrete_distribution?