2016-11-02 32 views
0

我有一個相當有趣的問題(無論如何,作爲一個初學者和所有人):在C++中,可以使用push_back()方便地生成一個向量,然後可以簡單地放入一個循環以根據需要增長。問題是,我發現沒有類似的簡單功能來減小尺寸。我真正想要做的是創建一個具有預定義大小的向量,然後假設完全刪除它的後半部分(不僅包含元素,而且還應該減小向量大小)。舉個例子:如何刪除矢量的一系列元素,以改變其大小(C++)?

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的元素,但它不會工作。 「沒有從int到const迭代器的已知轉換」

感謝您的幫助。

+0

看起來你可能需要擦除remove慣用法 – NathanOliver

+0

'numrange.resize(numrange.size ()/ 2);'將調整'numsize'只包含第一個'numrange.size()/ 2'元素,破壞向量中元素的後半部分。 – jaggedSpire

+0

當你說「矢量大小也應該減小」時,你的意思是「減少'sizeize'返回的值」,還是你的意思是「減小'size'和'capacity''返回的值?後者更難(在C++ 98中幾乎不可能,我認爲在更新的版本中有機制)。 –

回答

2

std::vector<>erase()成員函數採用類型爲std::vector<>::const_iterator的迭代器。您正在向該功能提供int,因此無法進行呼叫,因爲int未隱式轉換爲std::vector<>::const_iterator

您需要通過以下方式來抵消的迭代器:

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

但是,請注意,您初始化ivectsize,其本身初始化爲numrange.size()。這意味着您嘗試擦除範圍末尾的一個元素。您應該使用numrange.size() - 1

此外,有擦除範圍,其可以應用相同的偏移原理重載:

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

的方法的std::vectorerase期望的迭代器,而不是一個int索引作爲參數。

您可以使用開始迭代器,只是添加元素的量跳過以達到所需的迭代器:

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