我正在寻找一种从矢量中删除重复项的方法(让我们称之为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
答案 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)在最坏的情况下,只需要提供相等运算符。