如果我有一个带有初始化列表的构造函数:
std::vector<int> _list;
Program::Program() : _list(0)
{
}
即使向量调整自身,这是否会将所有值初始化为0?
答案 0 :(得分:1)
您似乎误解了您正在调用的向量构造函数的参数。 _list(0)
将_list
初始化为零长度,使用int类型的默认值,该值也恰好为零,但如果向量不包含任何元素,则无关紧要。它没有将元素值显式设置为零。也许你的意思是让构造函数重复指定次数的单个值?如果是这样,您需要传递所需的长度作为第一个参数,并将值重复为其第二个参数。此构造不会影响随后调整大小以扩展向量,这将使用默认值填充新向量元素(如果指定一个作为vector::resize
的附加参数,则使用不同的值)。
这是一个示例,根据您的代码说明,首先使用重复长度为5的值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,
答案 1 :(得分:0)
如果您查看the documentation for the std::vector
constructor,您会看到对于您正在使用的构造函数(3)
,您会看到正在构建0
类型的元素int
中就地_list
。这意味着你基本上什么都不做。
当向量调整大小时,除非使用resize
函数,否则分配空间的元素将是未初始化的,在这种情况下,元素将初始化为其默认值或您选择的值
例如,如果你的向量是空的并且你做了_list.resize(10);
,那么_list
现在将包含默认构造类型int
的10个元素,它们应该只是{{1} }}。如果您改为执行0
之类的操作,_list.resize(10, 5);
现在将包含10个_list
。
我希望这有助于为您解决问题。如果您有任何后续问题,请随时提出。