【问题标题】:Allocation vector of vector [duplicate]向量的分配向量
【发布时间】:2020-04-16 17:53:55
【问题描述】:

我有一个按以下方式构建的向量向量:

std::vector<std::vector<int>> symbols;

我想在结构中插入一些 int。为此,我想检查插入 int 的位置是否合法。我试图让向量以一种动态的方式成长。 为此,我写了如下代码:

void checkIndex(unsigned int i0, unsigned int i1) {
int mult_fac=2;
if(i0>=symbols.capacity()-1){
    symbols.reserve((i0+1)*mult_fac);

}
if(i1>=symbols[i0].capacity()-1){
    symbols[i0].reserve((i1 + 1)*mult_fac);
}

}

为了验证所有这些是否有效,我写了一个 main:

int main() {

for(;;){
    int i=rand()%1000;
    int j=rand()%1000;
    checkIndex(i,j);
}
return 0;}

但是,输出显示内存访问错误:

“进程结束,退出代码 -1073741819 (0xC0000005)”

我使用的是 Windows 10。 我无法理解如何解决它! 谢谢你帮助我。

【问题讨论】:

  • reserve 只分配空间,它不会在向量中创建对象。因此,如果该索引处没有对象,您将无法访问 symbols[i0]

标签: c++ vector stdvector


【解决方案1】:

明显的问题是capacity() 没有告诉你向量的大小,你需要size()reserve() 不会改变向量的大小,你需要resize()

最后你的测试太悲观了,在将caapcity 更改为size 之后,你可能只是有

if (i0 >= symbols.size()) {

if (i1 >= symbols[i0].size()) {

你不需要那里的-1,如果索引>=到大小,则索引无效。

【讨论】:

  • 你在那里读到了什么让你不使用它?如果您想调整矢量的大小,使用它是显而易见的。
  • 我没有使用resize,因为我在cpp参考上读到:如果当前大小大于count,其中count是resize方法的参数,容器被缩小到它的第一个计数元素:[链接]en.cppreference.com/w/cpp/container/vector/resize
  • @Martina_bxxu 但当前大小不能大于计数if (i0 &gt;= symbols.size()) { 阻止这种情况。向量只会增长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 2021-08-13
相关资源
最近更新 更多