我知道如何刪除一個std向量的重複與STL這樣的std ::矢量刪除重複項,然後刪除同一指數的另一種載體
但如果我有一個不同的vec2
這與vec1
的長度相同,我希望刪除vec1
中刪除的相同索引?這樣,如果指數2,4和6 VEC 1被拆除,同樣會在VEC 2移除
我知道如何刪除一個std向量的重複與STL這樣的std ::矢量刪除重複項,然後刪除同一指數的另一種載體
但如果我有一個不同的vec2
這與vec1
的長度相同,我希望刪除vec1
中刪除的相同索引?這樣,如果指數2,4和6 VEC 1被拆除,同樣會在VEC 2移除
也許你要考慮不同的數據結構,或許vector<pair<vec1_type, vec2_type>>
但在這裏做到這一點(C單程++ 11)
std::vector<int> indices(vec1.size());
std::iota(indices.begin(), indices.end(), 0);
indices.erase(std::unique(indices.begin(), indices.end(),
[&](int a, int b){ return vec1[a] == vec1[b]; }),
indices.end());
auto vec1_iterator = vec1.begin();
auto vec2_iterator = vec2.begin();
for (int i : indices) {
*vec1_iterator++ = vec1[i];
*vec2_iterator++ = vec2[i];
}
vec1.erase(vec1_iterator, vec1.end());
vec2.erase(vec2_iterator, vec2.end());
這是一個很好的方法,可以對它進行排序與iota部分的haskellish,我從來沒有見過,謝謝你介紹給我 – pyCthon
使原始載體的拷貝,然後步行兩個向量中搜索匹配項目,並且從並行矢量抹去,當你沒有找到一個匹配:
vector<int> copy(vec1);
vec1.erase(std::unique(vec1.begin(), vec1.end()),vec1.end());
vector<string> pv = // your "parallel" vector
for (int i = 0 ; i != vec1.size() ; i++) {
while (copy[i] != vec1[i]) {
copy.erase(copy.begin()+i);
pv.erase(pv.begin()+i);
}
}
僅當它們連續時纔會刪除重複項。在調用'unique' /'erase'之前,你是否對'vec1'進行排序? – dasblinkenlight
@dasblinkenlight在我的情況下,它沒有排序,但有很多連續的重複,它是一個奇怪的分佈cdf我可以把一個樣本數據集,如果你想 – pyCthon
@pyCthon:爲什麼不使用'std :: set'? –