C++ 向量删除重复项,然后删除另一个向量中的相同索引

C++ 向量删除重复项,然后删除另一个向量中的相同索引,c++,C++,我知道如何使用STL删除std向量的副本 vec1.erase(std::unique(vec1.begin(), vec1.end()),vec1.end()); 但是,如果我有一个不同的vec2,其长度与vec1相同,并且我希望删除在vec1中删除的相同索引,该怎么办?因此,如果在vec1中删除索引2、4和6,那么在vec2中将删除相同的索引也许您想考虑一种不同的数据结构,也许vector 但是这里有一种方法(c++11) std::向量索引(vec1.size()); std::iota

我知道如何使用STL删除std向量的副本

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

但是,如果我有一个不同的
vec2
,其长度与
vec1
相同,并且我希望删除在
vec1
中删除的相同索引,该怎么办?因此,如果在vec1中删除索引2、4和6,那么在vec2中将删除相同的索引

也许您想考虑一种不同的数据结构,也许
vector

但是这里有一种方法(c++11)

std::向量索引(vec1.size());
std::iota(index.begin()、index.end()、0);
index.erase(std::unique(index.begin()、index.end()、index,
[&](inta,intb){return vec1[a]==vec1[b];}),
index.end());
自动vec1_迭代器=vec1.begin();
自动vec2_迭代器=vec2.begin();
for(int i:索引){
*vec1_迭代器++=vec1[i];
*vec2_迭代器++=vec2[i];
}
vec1.erase(vec1_迭代器,vec1.end());
擦除(vec2_迭代器,vec2.end());

复制原始向量,然后遍历两个向量以搜索匹配项,如果未找到匹配项,则从平行向量中删除:

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);
    }    
}
向量拷贝(vec1);
擦除(std::unique(vec1.begin()、vec1.end()、vec1.end());
向量pv=//您的“平行”向量
for(int i=0;i!=vec1.size();i++){
while(复制[i]!=vec1[i]){
copy.erase(copy.begin()+i);
pv.erase(pv.begin()+i);
}    
}

这仅在重复项连续时删除重复项。在调用
unique
/
erase
之前,是否对
vec1
进行排序?@dasblinkenlight在我的例子中,它没有排序,但有许多连续的重复项,这是一个奇怪分布的cdf,如果你愿意,我可以放一个样本数据集like@pyCthon:为什么不使用
std::set
?@JesseGood在这一部分之前,我遵循的算法中有许多操作没有执行both@JesseGood我想我可以把它们转换成std::set,但这不是效率更低吗?这是一个非常复杂的问题做这件事的好方法,有点像哈斯凯尔式的,我以前从未见过,谢谢你介绍给我
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);
    }    
}