從矢量中移除一組非連續元素(我有他們的位置)的最快方法是什麼?或者得到一個沒有這些元素的新矢量。從位置中刪除一些元素
例如,我有矢量V1 = < 5,9,6,7,12,0,3>。我有一個位置向量,我想根據元素是否應該被消除或者沒有向量rem =來消除向量rem = < 0,3,4,6>或者包含true/false的向量。然後新的矢量將是矢量v2 = < 9,6,0>。
從矢量中移除一組非連續元素(我有他們的位置)的最快方法是什麼?或者得到一個沒有這些元素的新矢量。從位置中刪除一些元素
例如,我有矢量V1 = < 5,9,6,7,12,0,3>。我有一個位置向量,我想根據元素是否應該被消除或者沒有向量rem =來消除向量rem = < 0,3,4,6>或者包含true/false的向量。然後新的矢量將是矢量v2 = < 9,6,0>。
如果原始矢量元素的順序並不重要,我建議你遍歷你想增加以去除指數(這很重要),併爲每個元素與向量的最後一個元素交換它並致電pop_back
。
您還必須進行檢查,看是否向量的最後一個元素進行交換之前被去除。儘管最後一個元素的索引也是要刪除的元素之一pop_back
和然後做了交換並且pop_back
。
編輯:只是爲了澄清 - 因爲你有要刪除的元素的索引已經排序,你可以通過檢查最後一個值你還沒有刪除指數數組。使用助手整數索引來跟蹤哪個索引是,將其初始化爲索引數組的大小以刪除負數,並在每次刪除最後一個元素時將其減1。
我會一起遍歷矢量,有點像合併算法。事情是這樣的:
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
矢量必須進行排序。
編輯:通過使用索引向量的第三個變量名稱進行更正。
通過最快的,我用的代碼最短,也是一個位優化的假設:
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++;
}
可能無法編譯,上面的代碼是純粹寫給它的算法。
你應該保持原始向量中元素的順序嗎? –
明顯的解決方案是迭代要刪除的索引向量,然後在v1上調用'erase(iterator)'。 – crush
@IvayloStrandjev不一定是我們可以得到例如V2 = <0,9,6>,但它不應該是隨機的......如果我再次應用相同的功能,以V1應該以相同的順序返回元素在V2 .. – shn