Aren的载体是否可以避免超出范围?

时间:2016-06-16 07:47:31

标签: c++ c++11 vector stl

我看到了this question,并注意到一条评论说:

  

也许你超越其中一个向量?

我没有询问带有[]索引到一个超出范围的元素,这显然是超出界限的。而且据我所知,这不是OP所做的。 (我可能完全错了。)我还没有听说过任何其他与std::vector走出界限的情况。

我被教导使用.push_back(/*data*/)时保护矢量不受限制。由于评论员的声誉很高,我的评论来自于知识的深度。该问题中的OP使用.push_back(),我再次认为这是一个std::vector成员函数,不受出界限制。

在这方面我是否应该了解std::vector有哪些重要内容?C ++中比我更专业的人可以解释一下?

3 个答案:

答案 0 :(得分:6)

不,他们不 受保护。 C ++使 easy 更正确:

std::vector<int> v;
for (int i : v) // cannot go out of bounds

但一般情况下,您无法始终事先证明您是否正确:

std::vector<int> v = something();
int i = v[v[0]]; // How would the compiler know if it's legal?

为了使这个安全无关v的内容,你可以写

int i = v.at(v.at(0)); // might throw at runtime

但由于额外的运行时检查,这个速度较慢。

答案 1 :(得分:1)

某些vector方法有边界检查,但不是全部。

Bounds-checked操作(对无效索引抛出std::out_of_range):

  • at

未经检查的操作(表示无效索引的未定义行为):

  • operator[]

任何迭代器的使用都要求迭代器有效(或者,在某些情况下,是&#39; end&#39;迭代器):

  • erase
  • emplace

某些方法需要一个前提条件(如果向量为空,则显示未定义的行为):

  • front
  • back
  • pop_back

答案 2 :(得分:0)

使

std::vector像数组一样使用,因此索引运算符没有检查性能的原因。在Debug构建中,他们可能有断言来查找错误。但是在发布版本中不存在此类检查。这样编译器可以优化远离函数调用本身,并将数组访问放在调用站点。访问元素超出范围是未定义的行为,应该使用vector::at(性能成本!)

push_back可能会抛出默认分配器的运行时异常(bad_alloc)。