pop_back()的问题不是删除向量元素c ++

时间:2015-09-17 21:44:04

标签: c++ vector

我希望这不是一个重复的问题,但我在这里找不到解决我的问题的答案。

我创建了一个固定行和列长度的2D矢量,然后用我运行的模拟信息填充它。我故意将行长度设置得比需要的长得多,因为我的一些模拟产生的数据比其他模型更多。

我想要做的就是从我的向量中删除没有给出任何数据的行。这是我的代码:

int states = 13;
int duration = 1000;
vector<int> temp(states, -1);

vector<vector<int> > state_data(duration, temp);
    //Fill in some number of the rows
    int x=0;
    while(condition){
        state_data[x][1] = 3;    
        ...
        state_data[x][13] = 10;
        x++;
    }    

    for(int i =0; i < (state_data.size()-x+1); i++){
        state_data.pop_back();
    }

    // Also have tried this:
    // state_data.erase(x, state_data.size());
    return state_data;
}

pop_back版本不会出错,但不会删除行。无论我一次尝试删除1个还是多个,擦除函数都会出错:"candidate expects 2 arguments, 1 provided""no matching function for call to 'std::vector<std::vector<int> >::erase(int)"

我找到的所有擦除的答案都使用这两个函数给出了答案,我无法弄清楚为什么在这种情况下我也没有做我想做的事情。我非常感谢你能提出的关于为什么这些功能没有按照我的意愿行事的建议!

1 个答案:

答案 0 :(得分:2)

首先,您遇到的pop_back问题是每次弹出时大小都在变化。考虑一下,如果x为5且矢量大小为10,则计划删除5个元素,留下0到4。

首先,大小 - 5 + 1为6,i为零,循环块执行,我将增加到1.

此时,大小 - 5 + 1将为5,i为1,循环继续。 对i == 2进行4,然后当i == 3时进行3。循环将终止。

此时容器大小将为7.您希望它为5,但由于每个弹出窗口的大小减小,“计数器”接近缩小限制。你应该在循环之前计算大小 - 5 + 1,将其存储为'lim'或你喜欢的东西,在for循环中使用它来对i进行测试。查找向量的resize函数可能会更好,它会为你做这个。

此外,请注意使用[]创建的矢量限制和访问,尤其是行

state_data[x][13] = 10;

您为13个条目分配了空间,但INDEX 13是第14个条目。向量不会使用[]运算符进行扩展,因此应该崩溃。

您可能需要考虑使用std :: array作为一些设计选择,而不是矢量,特别是对于设计中的内部向量,因为它们是更轻,固定大小的分配。

现在,关于创建行然后在以后删除它们的概念。这不是必要的。有两种可能的解决方案更好。

首先,考虑使用reserve而不是pop。无论如何,流行音乐可能不会做你想的。它将删除行,减少已知在向量中的项的长度,但不保证STORAGE将减少(缩小时调整大小相同)。 RAM块在创建时动态分配,或在扩展时重新分配,但是当您弹出时,矢量可能不会收缩STORAGE。它占用的实际存储空间可能保持不变,这与您提前发布存储空间的结果相同,并且数据的push_backs将填充。

如果您初始化多个行超过所需行数并且之后弹出的原因不是存储策略,而是使用[],则应重新考虑并使用push_back,这样可以避免性能损失和弹出的额外复杂性首先你不需要的所有“额外”行。

这是deque可能是更好的选择之一。 Deques确实响应“缩小”,在很多方面都像矢量一样,但允许在结构的两端推送和弹出,内部存储更灵活。

您可以使用deque作为行的容器(外部容器),并且可能使用std :: array作为每个固定大小的行的内部容器。

这可能看起来像:

std::deque<std::array<int, 13> > state_data(duration, temp);

或类似的东西,可能仍然作为内部存储器,取决于灵活性要求