【问题标题】:std::vector elements initializingstd::vector 元素初始化
【发布时间】:2012-06-09 23:32:02
【问题描述】:
std::vector<int> v1(1000);
std::vector<std::vector<int>> v2(1000);
std::vector<std::vector<int>::const_iterator> v3(1000);

这3个向量的元素是如何初始化的?

关于int,我测试了一下,发现所有元素都变成0了,这是标准吗?我相信原语仍未定义。我创建了一个包含 300000000 个元素的向量,给出非零值,删除它并重新创建它,以避免操作系统内存被清除以确保数据安全。重新创建的向量的元素也是0。

迭代器呢?默认构造函数是否有初始值 (0) 或初始值未定义?当我检查这个时,迭代器指向 0,但这可以是 OS

当我创建一个特殊对象来跟踪构造函数时,我看到对于第一个对象,vector 运行默认构造函数,而对于所有其他对象,它运行复制构造函数。这是标准吗?

有没有办法完全避免元素的初始化?或者我必须创建自己的向量? (天哪,我总是说不是另一个向量实现) 我问是因为我使用并行处理的超大稀疏矩阵,所以我不能使用 push_back(),当然我不想要无用的初始化,稍后我会更改值。

【问题讨论】:

    标签: c++ vector


    【解决方案1】:

    你正在使用这个构造函数(对于std::vector&lt;&gt;):

    explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 
    

    其中有以下documentation

    重复序列构造函数:初始化向量,并将其内容设置为重复 nvalue 的副本。

    由于您没有指定value,它采用参数的默认值T(),在您的情况下为int,因此所有元素为0

    【讨论】:

    • 我相信 C++11 将其更改为 n default initialized values 而不是一个默认初始化,然后是多个副本。
    • @Attila 查看我对 C++11 引用的回答。
    • 是的 C++11 将其更改为 n 个默认构造函数。已确认。
    【解决方案2】:

    它们是默认初始化的。

    关于int,我测试了一下,发现所有元素都变成0了,这是标准吗?我相信原语仍未定义。

    不,未初始化 int 具有 indeterminate 值。这些是默认初始化的,即,

    int i;          // uninitialized, indeterminate value
    int k = int();  // default initialized, value == 0
    

    【讨论】:

      【解决方案3】:

      在 C++11 中,构造函数 vector::vector(size_type n) 的规范说 n 元素是默认插入的。这被定义为由表达式allocator_traits&lt;Allocator&gt;::construct(m, p) 初始化的元素(其中m 是分配器类型,p 是指向存储在容器中的类型的指针)。对于默认分配器,此表达式为::new (static_cast&lt;void*&gt;(p)) T()(请参阅20.6.8.2)。这个值初始化每个元素。

      【讨论】:

        【解决方案4】:

        向量的元素是默认初始化的,在 POD 类型的情况下意味着零初始化。使用标准向量是无法避免的。

        【讨论】:

        • 它们不是默认初始化的,而是值初始化的。
        • @ildjarn,我知道我要搞砸了。我永远无法保持这些初始化样式直截了当。
        • 我也搞砸了。 C++ 的语义仍然时不时地让我无法理解,我每天都在使用这种语言……
        猜你喜欢
        • 2013-06-06
        • 2011-08-22
        • 2013-07-13
        • 1970-01-01
        • 2012-08-07
        • 2020-09-03
        • 2017-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多