从不可排序的向量中删除重复项

时间:2013-04-24 09:42:57

标签: c++ duplicates stdvector

我正在寻找一种从矢量中删除重复项的方法(让我们称之为theGreatVector:D)。 我不能使用std :: sort后跟std :: unique,因为无法对我的对象进行排序。

theGreatVector包含一些vector<Item*>(smallVectors)

vector<Item*>我的==重载超载,所以我可以使用它

我能用O(n²)创建一些东西,但我需要时间效率 (theGreatVector.size()可以是10⁵或10⁶)

现在我得到的是这样的 (只有当smallOne不在其中时才填充我的载体):

for(i=0;i<size;i++)
{
  vector<Item*>smallOne = FindFacets(i)
  if(smallOne doesnt belong to GreatOne) // this line already in O(n) :/
  {
     theGreatOne.push_back(smallOne);
  }
}

如果有一种方法可以做到这一点,即使在nlog(n)+ n或任何低于n²的东西,那就太棒了!

非常感谢

AZH

2 个答案:

答案 0 :(得分:0)

您始终可以std::tie将每个数据成员std::tuple添加到std::unique并使用字典顺序排序指向大数据结构的指针向量。然后,您可以在复制输出之前对该数据结构执行Item。通过小修改,您还可以通过直接对大#include <tuple> #include <memory> #include <vector> // tuples have builtin lexicographic ordering, // I'm assuming all your Item's data members also have operator< bool operator<(Item const& lhs, Item const& rhs) { return std::tie(lhs.first_data, /*...*/ lhs.last_data) < std::tie(rhs.first_data, /*...*/ rhs.last_Data); } int main() { // In the Beginning, there was some data std::vector<Item> vec; // fill it // init helper vector with addresses of vec, complexity O(N) std::vector<Item*> pvec; pvec.reserve(vec.size()); std::transform(std::begin(vec), std::end(vec), std::back_inserter(pvec), std::addressof<Item>); // sort to put duplicates in adjecent positions, complexity O(N log N) std::sort(std::begin(pvec), std::end(pvec), [](Item const* lhs, Item const* rhs){ return *lhs < *rhs; // delegates to operator< for Item }); // remove duplicates, complexity O(N) auto it = std::unique(std::begin(pvec), std::end(pvec), [](Item const* lhs, Item const* rhs){ return *lhs == *rhs; // assumes Item has operator==, if not use std::tuple::operator== }); pvec.erase(it, std::end(pvec)); // copy result, complexity O(N) std::vector<Item> result; result.reserve(pvec.size()); std::transform(std::begin(pvec), std::end(pvec), std::back_inserter(result), [](Item const* pelem){ return *pelem; }); // And it was good, and done in O(N log N) complexity } 向量进行排序来删除重复项。

{{1}}

答案 1 :(得分:0)

看一下无序集: http://www.cplusplus.com/reference/unordered_set/unordered_set/ 它似乎做你想要的。单个元素的插入在O(1)中平均完成,O(n)在最坏的情况下,只需要提供相等运算符。