了解C 中的向量初始化

Understanding vector initialization in C++

本文关键字:向量 初始化 了解      更新时间:2023-10-16

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

std::vector<int> _list;  
Program::Program() : _list(0)
{
}  

即使矢量大小大小,这也将所有值初始化为0?

您似乎正在误解您要调用的向量构造函数的论点。_list(0)将使用类型INT的默认值初始化_list至Zero的长度为零,该值也恰好为零,但是如果向量不包含任何元素,则无关紧要。它没有将元素 value 明确设置为零。也许您打算让构造函数重复一个指定数量的单个值?如果是这样,则需要将所需的长度作为第一个参数,而值重复其第二个参数。该构造不会影响随后的调整大小以扩展向量,该大小将填充新的向量元素具有默认值(或者如果将一个值指定为vector::resize的附加参数,则将具有不同的值)。

这是一个基于您的代码来说明的示例,该示例首先用值 10重复长度为5的vector,然后将矢量调整为长度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构造函数的文档,您会看到constructor (3)(您正在使用的 CC_6)在_list中键入int。这意味着您本质上什么都不做。

调整向量时,除非您使用resize函数,否则分配空间的元素将是非初始化的,在这种情况下,元素将被初始化为其默认值或您选择的值。

例如,如果您的向量是空的,并且您进行了_list.resize(10);,则_list现在将包含10个默认结构类型的int元素,该元素应为0。如果您做了类似_list.resize(10, 5);之类的事情,则_list现在将包含10个5s。

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