【问题标题】:Size and resize function of vector container in c++c++中向量容器的大小和调整大小功能
【发布时间】:2018-01-12 09:44:47
【问题描述】:

我不明白我的程序中函数 size() 和 resize() 的下一个行为。

我创建了一个包含 3 个元素的结构向量。

在代码的最后一部分,我使用了函数 resize() 以便只有 2 个元素。然后我再次为 3 个元素赋值,得到一个 3 元素向量。

在最后一部分中,我可以调用向量 vector_a 的 3 个元素,所以我知道我有一个 3 元素向量,但是函数 size() 给我的输出是我有 2 个元素。

// Example program
#include <iostream>
#include <vector>

int main()
{
    struct struct_1
    {
        int variable_1;
        int variable_2;
    };

    std::vector<struct_1> vector_a;

    vector_a.push_back(struct_1());
    vector_a.push_back(struct_1());
    vector_a.push_back(struct_1());

    vector_a.resize(2);


    vector_a[0].variable_1 = 21;
    vector_a[0].variable_2 = 34;

    vector_a[1].variable_1 = 111;
    vector_a[1].variable_2 = 764;

    vector_a[2].variable_1 = 5656;
    vector_a[2].variable_2 = 5666764;

    std::cout << "size    " << vector_a.size() << std::endl;
}

我错过了什么?

【问题讨论】:

  • 使用operator[] 的索引没有边界检查。如果您想要边界检查,请使用at。你向量中有两个元素,这就是resize调用所做的。
  • “在最后一部分中,我可以调用向量 vector_a 的 3 个元素,所以我知道我有一个 3 元素向量” 不,只是因为编译器没有阻止你做某事并不意味着这件事可以做。 C++ 不会主动保护每个人免受所有错误的影响,因为对于已经知道如何避免这些错误的人来说,这会导致代码变得毫无意义地变慢。

标签: c++ vector


【解决方案1】:

operator[] 直接访问内存,不检查边界,所以在大小仅为 2 时引用索引 2 是无效的。

代码中有时会出现一个相关问题,即开发人员调用 vector.reserve(10),然后将元素 0 到 9 索引(而不是 reserve,他们应该调用 resize)。

【讨论】:

    【解决方案2】:

    looks like you wouldn't get exception out of range 如果您继续以这种方式访问​​元素...如果您想获得异常,请尝试 .at() 方法。

    类似的成员函数 vector::at 与此运算符函数具有相同的行为,不同之处在于 vector::at 进行了边界检查,并通过抛出 out_of_range 异常来指示请求的位置是否超出范围。

    便携式程序永远不应使用超出范围的参数 n 调用此函数,因为这会导致未定义的行为。

    【讨论】:

      【解决方案3】:

      添加之前的答案

      然后我再次为 3 个元素赋值,得到一个 3 元素向量。

      你不是,来自cppreferencestd::vector::operator[]的描述

      返回对指定位置 pos 的元素的引用。不 执行边界检查。

      如果您正在访问超出范围的元素(它不像std::map),则此运算符不会将元素添加到向量中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-09
        • 1970-01-01
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-02
        相关资源
        最近更新 更多