【问题标题】:Why C++ STL vector does not go out of range为什么 C++ STL 向量不会超出范围
【发布时间】:2015-01-31 20:54:59
【问题描述】:

我有这段代码,我想知道它是如何工作的;为什么它允许我使用大于使用operator[] 的向量大小的值访问元素?

但是当我使用进行边界检查的at() 函数时,它会抛出正确的错误。

我读到这样做的行为是undefined,但我很好奇:为什么operator[] 对超出范围的元素访问有效?

// vector of length 3
std::vector<int> adj(3);

// output: 3
printf("Size of adj is %lu\n", adj.size());

// assign using index that is larger than vector size, e.g., 12
adj[12] = 314159;

// succeeds, output: 314159
printf("adj[12] is %d", adj[12]);

// fails, throws out_of_range
adj.at(12);

【问题讨论】:

    标签: c++ data-structures stl


    【解决方案1】:

    出于速度原因,不检查越界。假设程序员在使用 operator[] 之前就知道自己在界限内。

    此外,未定义的行为可能会导致任何事情从预期的行为中发生变化,进而导致您的鼻腔中出现通往地狱的门户的崩溃。

    【讨论】:

    • 这很可能是我读过的对“未定义行为”的最佳描述。
    【解决方案2】:

    这确实是设计使然:订阅运营商 (operator[]) 不会检查您是否尝试越界。

    原因是性能。使用operator[] 与访问数组中的元素一样快。 C++ 是围绕性能而设计的,因此这是高性能领域中大多数 C++ 项目所急需的特性。

    at 函数是为可以用性能换取运行时验证的项目提供的。如果您没有必须快速通过向量的关键更新循环,并且您希望您的代码在用户确实要求访问越界数据时抛出,那么使用at() 会很有帮助。

    大多数 C++ 用户会默认使用operator[] 以提高效率,并确保不会产生无效索引(不一定通过检查,而只是通过使算法不可能越界,例如仅使用有效的迭代器和size())

    【讨论】:

      猜你喜欢
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 2020-03-14
      • 2010-11-11
      • 2021-05-01
      相关资源
      最近更新 更多