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<int>
分配在页面开头附近(在?)
在你把东西放进去之前,向量是否需要分配空间?
@cHao:不,不是。
我可能错了,但我认为分配比需要更多容量的向量是为了避免频繁的重新分配(比如说在使用push_back
的循环中),而不是避免内存碎片整理。或者你的意思是一样的;)以上是关于c++中向量中的随机访问[重复]的主要内容,如果未能解决你的问题,请参考以下文章