c++中向量中的随机访问[重复]

Posted

技术标签:

【中文标题】c++中向量中的随机访问[重复]【英文标题】:Random access in vector in c++ [duplicate] 【发布时间】:2018-08-08 15:49:01 【问题描述】:

在 C++ 中尝试随机访问空向量时,出现分段错误。

vector<int> g;
cout<<g[3];  //Segmentation fault

但是如果我们做一次 push_back() 操作,那么我们可以做随机访问没有错误:

vector<int> g;
g.push_back(1);
cout<<g[0]; //output = 1
cout<<g[3]; //output = 0

这背后的原因是什么??

【问题讨论】:

如果我没记错的话,向量会分块分配内存。您可能无法访问更高的索引。无论如何,这种行为是未定义的 第一次使用向量(甚至其他容器)时,首先使用at 而不是[]at 会在你越界并抛出异常时捕获。 @NathanOliver:不过,这是有代价的,尤其是在进行线性代数计算时。 但是如果我们做一个 push_back() 操作,那么我们可以做随机访问没有错误: -- 有一个错误 -- 你选择了一个元素在向量的范围之外。该错误的可见结果是什么是另一回事。 @PeteBecker 我将默默地继续使用垃圾归类为“坏事”。 比意外终止要糟糕得多 【参考方案1】:

尝试获取std::vector 的元素,该元素超出该向量的边界 时的行为是未定义不要这样做,不要依赖任何行为。

也许您的push_back 导致std::vector 获取比它需要的更多的内存以防止频繁的重新分配和内存碎片整理?

【讨论】:

我可以看到不想碎片整理的情况,但我认为“反对内存碎片”更清楚一些。 心理调试:分段错误具有页面粒度,std::allocator&lt;int&gt; 分配在页面开头附近(在?) 在你把东西放进去之前,向量是否需要分配空间? @cHao:不,不是。 我可能错了,但我认为分配比需要更多容量的向量是为了避免频繁的重新分配(比如说在使用push_back 的循环中),而不是避免内存碎片整理。或者你的意思是一样的;)

以上是关于c++中向量中的随机访问[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 unordered_map 向量的 C++ 图形,在访问时添加随机数据,如 graph[i][j]

R在向量重复函数中保持随机函数

如何在 C++ 中随机分配给向量?

如何在不重复预定义三元组中的特定元素的情况下随机化向量?

使用C++生成1-33中的6个随机数,无重复

在不重复的范围内生成随机数