如何解决std :: vector :: reserve允许在push_back之前进行随机访问
我最近在网上了解了std::vector::reserve
。网站说,在std::vector
内保留内存不会改变向量的大小,而是会增加std::vector
的容量。保留后,尝试访问随机元素应该会崩溃。
但是,当我运行这段代码时:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector <int> v;
v.reserve(1000000);
v[4] = 5;
cout << v[4] << endl; // this line and the above line should cause errors
return 0;
}
什么都没发生。该程序运行并将5
打印到屏幕上,我一点也没有收到任何错误。
我不确定在这里是否出错,所以有人可以告诉我为什么上面的程序运行吗?
解决方法
预订后,尝试访问随机元素应该会崩溃。
不,说“保留后尝试访问随机元素将导致不确定的行为”会更正确。(a)。
未定义的行为表示准确,即未定义。它可能有效,但可能无效。它可能似乎可以工作,但稍后会在程序中设置导致严重失败的条件。它可能无法在其他实现中使用,甚至可能在一周的某些天在相同实现中无法使用。
底线,不要这样做。
(a) ISO C ++ 20中的表69具有两个元素访问操作,它们声明完全相同的内容:
a[n]
-返回引用,或返回const
引用为常数a
。语义:*(a.begin() + n)
。a.at(n)
-返回引用,或返回const
引用以获得常量a
。语义:*(a.begin() + n)
。
但是紧随其后的注释澄清了差异:
成员函数
at()
提供对容器元素的边界检查访问。如果at()
,out_of_range
会抛出n >= a.size()
。
因此,如果您需要使其“崩溃”(因为它确实引发了异常而不是崩溃而被引用),请使用后者。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。