繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM