理解C ++中的向量初始化

时间:2017-02-20 05:35:36

标签: c++ vector initialization

如果我有一个带有初始化列表的构造函数:

std::vector<int> _list;  

Program::Program() : _list(0)
{
}  

即使向量调整自身,这是否会将所有值初始化为0?

2 个答案:

答案 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

我希望这有助于为您解决问题。如果您有任何后续问题,请随时提出。