2013-01-24 80 views
0

從矢量中移除一組非連續元素(我有他們的位置)的最快方法是什麼?或者得到一個沒有這些元素的新矢量。從位置中刪除一些元素

例如,我有矢量V1 = < 5,9,6,7,12,0,3>。我有一個位置向量,我想根據元素是否應該被消除或者沒有向量rem =來消除向量rem = < 0,3,4,6>或者包含true/false的向量。然後新的矢量將是矢量v2 = < 9,6,0>。

+1

你應該保持原始向量中元素的順序嗎? –

+0

明顯的解決方案是迭代要刪除的索引向量,然後在v1上調用'erase(iterator)'。 – crush

+0

@IvayloStrandjev不一定是我們可以得到例如V2 = <0,9,6>,但它不應該是隨機的......如果我再次應用相同的功能,以V1應該以相同的順序返回元素在V2 .. – shn

回答

2

如果原始矢量元素的順序並不重要,我建議你遍歷你想增加以去除指數(這很重要),併爲每個元素與向量的最後一個元素交換它並致電pop_back

您還必須進行檢查,看是否向量的最後一個元素進行交換之前被去除。儘管最後一個元素的索引也是要刪除的元素之一pop_back然後做了交換並且pop_back

編輯:只是爲了澄清 - 因爲你有要刪除的元素的索引已經排序,你可以通過檢查最後一個值你還沒有刪除指數數組。使用助手整數索引來跟蹤哪個索引是,將其初始化爲索引數組的大小以刪除負數,並在每次刪除最後一個元素時將其減1。

+0

你能爲此提供一個和平的代碼嗎? – shn

+3

@shn我可以但是相信如果你自己想出代碼會更好。這是處理媒介的一個很好的練習。如果您遇到實施的某個特定部分,我會給您提供指導,但不想爲您編寫整個事情。 –

+0

你應該注意這個的複雜性...... – JaredC

0

我會一起遍歷矢量,有點像合併算法。事情是這樣的:

int index1=0, index2=0; 

while (index1 < v1.size()) { 
    if (index2 < rem.size() && index1 == rem[index2]) { 
     index2++; // skip this one 
    } 
    else { 
     v2.push_back(v1[index1]); // keep this one 
    } 

    index1++; 
} 

使用迭代器將是更清潔,並注意rem矢量必須進行排序。

編輯:通過使用索引向量的第三個變量名稱進行更正。

0

通過最快的,我用的代碼最短,也是一個位優化的假設:

size_t i = 0; 
size_t end = v1.size(); 
vector<int> vresult; 

vresult.reserve(v1.size() - rem.size()); // avoid reallocations 

size_t remIt = 0; 
for (; i != end; ++i) 
{ 
    if (i != rem[remIt]) 
    vresult.push_back(v1[i]); // push our element into the new vector 
    else 
    remIt++; 
} 

可能無法編譯,上面的代碼是純粹寫給它的算法。