[英]Understanding vector initialization in C++
如果我有一个带有初始化列表的构造函数,例如:
std::vector<int> _list;
Program::Program() : _list(0)
{
}
即使向量会自行调整大小,这是否会将所有值初始化为0?
您似乎误解了要调用的向量构造函数的参数。 _list(0)
使用类型int的默认值将_list
初始化_list
长度,该值也恰好为零,但是如果向量不包含任何元素,则这无关紧要。 它没有将元素值显式设置为零。 也许您打算让构造函数将单个值重复指定的次数? 如果是这样,则需要传递所需的长度作为第一个参数,并为其第二个参数重复该值。 这种构造不会影响随后调整大小以扩展矢量的大小,后者将使用默认值(如果您将一个指定为vector::resize
的附加参数,则为另一个值)填充新的矢量元素。
这是一个基于您的代码的示例,该示例首先使用长度10
重复的值10
初始化向量,然后将向量的大小调整为长度10。
#include <iostream>
#include <vector>
class Program
{
public:
Program() : _list(0) { }
Program(unsigned long size, int value) : _list(size, value) { }
void ResizeList(unsigned long size)
{
_list.resize(size);
}
void PrintList() const
{
std::cout << "_list = ";
for (const auto& val : _list)
{
std::cout << val << ", ";
}
std::cout << std::endl;
}
private:
std::vector<int> _list;
};
int main()
{
Program p(5, 10);
p.PrintList();
p.ResizeList(10);
p.PrintList();
return 0;
}
输出:
_list = 10, 10, 10, 10, 10,
_list = 10, 10, 10, 10, 10, 0, 0, 0, 0, 0,
如果查看std::vector
构造函数的文档 ,您会看到构造函数(3)
正在使用的那个(3)
,会发现您正在就地构造int
类型的0
元素_list
。 这意味着您实际上什么都不做。
调整矢量大小时,除非使用resize
函数,否则分配空间的元素将不会初始化,在这种情况下,这些元素将被初始化为其默认值或您选择的值。
例如,如果您的向量为空,并且您做了_list.resize(10);
, _list
现在将包含默认构造的int
类型的10个元素,应该只是0
。 如果您改为执行_list.resize(10, 5);
, _list
现在将包含10 5
s。
我希望这可以帮助您解决问题。 如果您有任何后续问题,请随时提出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.