从向量删除重复元素

Erase duplicate element from a vector

本文关键字:元素 删除 向量      更新时间:2023-10-16

i在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);
            }
        }

这是一个应该与较旧编译器一起使用的"原地"版本(不需要第二个向量):

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();
    }
}

让我知道这是否对您有用。请注意,元素的顺序不能保证保持不变。

类似的东西将起作用

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);

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

如果您可以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来使用hash-table。同时,您可以轻松地检查O(1)中是否已经存在一个元素(总共O(n))。您无需检查每个元素的所有其他元素,这将是时间成本的O(n^2)