如何删除一个不断改变其大小(C ++)的向量元素?

时间:2016-11-02 16:57:05

标签: c++ vector range erase

我有一个相当有趣的问题(无论如何,对我来说很有趣,作为初学者和所有人):在C ++中,人们可以使用push_back()轻松地生成一个向量,然后可以简单地将其放入一个循环中以增长需要。问题是,我发现没有类似的简单功能来减小它的大小。我真正想做的是,有一个具有预定义大小的向量,然后让我们说完全删除它的后半部分(不仅包含所包含的元素,还应减少向量大小)。一个例子:

vector<int> numrange;
for (int i=0; i<=100; ++i) {numrange.push_back(i);}

这适用于增长向量并用数字填充它。但似乎不允许这样做:

int vectsize=numrange.size();
for (int i=vectsize; i>=(vectsize/2); --i) {numrange.erase(i);}

你知道,我想要删除50以上的所有元素,但它不会起作用。与&#34;没有已知的从int到const迭代器的转换&#34;

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

std::vector<>&#39; erase()成员函数采用类型为std::vector<>::const_iterator的迭代器。您正在向该函数提供int,因此无法进行通话,因为int不会隐式转换为std::vector<>::const_iterator

您需要以下列方式偏移迭代器:

numrange.erase(numrange.cbegin() + i);

但是,请注意,您将i初始化为vectsize,其本身已初始化为numrange.size()。这意味着您尝试擦除范围末尾的一个元素。您应该使用numrange.size() - 1

此外,还有一些重载会擦除您可以应用相同偏移原理的范围:

numrange.erase(numrange.cbegin() + numrange.size() / 2, numrange.cend());

答案 1 :(得分:0)

erase的方法std::vector需要迭代器而不是int索引作为参数。

您可以使用begin-iterator,只需添加要跳过的元素数量即可到达所需的迭代器:

for (int i=vectsize; i>=(vectsize/2); --i) {numrange.erase(numrange.begin()+i);}