我有一个相当有趣的问题(无论如何,对我来说很有趣,作为初学者和所有人):在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;
感谢您的帮助。
答案 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);}