擦除向量中的重复元素

时间:2014-01-27 08:18:56

标签: c++ duplicates

我用c ++中的几个元素创建了一个向量,我想删除具有相同值的向量元素。基本上,我想删除找到重复元素的向量的整个索引。我的矢量被称为人。我正在尝试做类似的事情:

for(int i=0; i < person.size(); i++){
    if(i>0 && person.at(i) == person.at(0:i-1)) { // matlab operator
        continue;
    }
    writeToFile( perason.at(i) );   
}

如何创建运算符0:i-1来检查所有可能的索引组合?

编辑:我正在尝试GarMan解决方案,但我遇到了各自的问题:

        set<string> myset;
        vector<string> outputvector;

        for (string element:person)
        {
            if (myset.find(element) != myset.end())
            {
                myset.insert(element);
                outputvector.emplace_back(element);
            }
        }

3 个答案:

答案 0 :(得分:3)

这是一个“就地”版本(不需要第二个向量),应该适用于较旧的编译器:

std::set<std::string> seen_so_far;
for (std::vector<std::string>::iterator it = person.begin(); it != person.end();)
{
    bool was_inserted = seen_so_far.insert(*it).second;
    if (was_inserted)
    {
        ++it;
    }
    else
    {
        swap(*it, person.back());
        person.pop_back();
    }
}

如果这对您有用,请告诉我。请注意,元素的顺序不能保证保持不变。

答案 1 :(得分:2)

如果您sort vector std::unique,则可以致电#include <algorithm> std::sort(person.begin(), person.end()); person.erase(std::unique(person.begin(), person.end()), person.end());

sort

如果您不能hash-table,则可以使用O(1)代替扫描向量并相应地更新哈希表。同时,您可以轻松检查O(n)中是否已存在一个元素(总共O(n^2))。您不需要检查每个元素的所有其他元素,这将花费时间{{1}}。

答案 2 :(得分:2)

这样的东西会起作用

unordered_set<same_type_as_vector> myset;
vector<same_type_as_vector> outputvector;
for (auto&& element: myvector)
{
    if (myset.find(element) != myset.end())
    {
        myset.insert(element);
        outputvector.emplace_back(element); 
    }
}
myvector.swap(outputvector);

代码写入回复框,因此可能需要调整。