0

STLを使用してstdベクターの重複を削除する方法を知っています

vec1.erase(std::unique(vec1.begin(), vec1.end()),vec1.end());

vec2しかし、 と同じ長さの別vec1のインデックスがあり、 で削除されたのと同じインデックスを削除したい場合はどうすればよいvec1ですか? インデックス 2 、 4 、および 6 が vec1 で削除された場合、同じものが vec2 で削除されるように

4

2 に答える 2

1

元のベクトルのコピーを作成し、2 つのベクトルをたどって一致する項目を探し、一致する項目が見つからない場合は平行ベクトルから消去します。

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);
    }    
}
于 2012-09-21T02:46:19.133 に答える
1

おそらく、別のデータ構造を考えたいと思うかもしれません。vector<pair<vec1_type, vec2_type>>

しかし、これを行う1つの方法があります(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());
于 2012-09-21T02:42:34.227 に答える