如何从C++数组中删除重复项
How do I remove duplicates from a C++ array?
我有一个结构数组;阵列大小为N。
我想从数组中删除重复项;也就是说,执行一个就地更改,将数组转换为每个结构的单一外观。此外,我想知道新的大小M(缩减数组中的最高索引(。
结构包括基元,所以比较它们很简单。
我如何在C++中高效地做到这一点?
我已经实现了以下操作程序:
bool operator==(const A &rhs1, const A &rhs2)
{
return ( ( rhs1.x== rhs2.x ) &&
( rhs1.y == rhs2.y ) );
}
bool operator<(const A &rhs1, const A &rhs2)
{
if ( rhs1.x == rhs2.x )
return ( rhs1.y < rhs2.y );
return ( rhs1.x < rhs2.x );
}
然而,我在运行时遇到了一个错误:
std::sort(array, array+ numTotalAvailable);
* array will have all elements here valid.
std::unique_copy(
array,
array+ numTotalAvailable,
back_inserter(uniqueElements));
* uniqueElements will have non-valid elements.
这里怎么了?
您可以使用std::sort
和std::unique
算法的组合来实现这一点:
std::sort(elems.begin(), elems.end()); // Now in sorted order.
iterator itr = std::unique(elems.begin(), elems.end()); // Duplicates overwritten
elems.erase(itr, elems.end()); // Space reclaimed
如果您使用的是原始数组(而不是std::vector
(,那么如果不将元素复制到新的范围,就无法实际回收空间。但是,如果您可以从一个原始数组开始,最后得到std::vector
或std::deque
之类的东西,那么您可以使用unique_copy
和迭代器适配器来复制唯一的元素:
std::sort(array, array + size); // Now in sorted order
std::vector<T> uniqueElements;
std::unique_copy(array, array + size,
back_inserter(uniqueElements)); // Append unique elements
在这一点上,uniqueElements
现在拥有所有的唯一元素。
最后,为了更直接地解决您的初始问题:如果您想在适当的位置执行此操作,您可以通过使用unique
的返回值来确定保留了多少元素来获得答案:
std::sort(elems, elems + N); // Now in sorted order.
T* endpoint = std::unique(elems, elems + N);// Duplicates overwritten
ptrdiff_t M = endpoint - elems; // Find number of elements left
希望这能有所帮助!
std::set<T> uniqueItems(v.begin(), v.end());
现在uniqueItems
只包含唯一项。用它做任何你想做的事情。也许,你希望v
包含所有唯一的项目。如果是,则执行以下操作:
//assuming v is std::vector<T>
std::vector<T>(uniqueItems.begin(), uniqueItems.end()).swap(v);
现在v
包含了所有的唯一项。它还将v
缩小到最小大小。它利用了Shrink-to-fit
成语。
您可以使用轻量级模式。最简单的方法是使用Boost Flyweight库。
编辑:我不确定是否有办法找出Boost轻量级实现存储了多少对象,如果有,我似乎在文档中找不到。
将算法应用于数组的另一种方法是将其元素插入std::set
中。这样做是否合理取决于你计划如何使用你的物品。
相关文章:
- 你能帮我解决删除数组 c++ 中重复值的挑战吗?
- 删除[i] 数组和删除数组 [i] 之间的区别
- 如何实现删除数组的功能?
- 删除数组 c++ 崩溃问题
- 如何删除数组列表中的元素
- C++删除数组只会解除分配第一项
- 删除数组成员的更好方法是什么?
- 如何使用 deleteEntry 函数 c++ 删除数组中的单个字符串
- 删除数组中所有出现的数字 C++
- C++ 删除数组时检测到堆损坏
- 不允许删除数组的一部分,为什么
- 如何删除数组中第一次出现的值
- 当我删除数组时,指针在哪里?指向数组的指针与数组中的元素之间的区别
- 尝试用C 中的空地址(而非null)删除数组指针
- 为什么 std::remove 不删除数组的最后一个元素
- 如何使用c++删除数组中的一些值
- 仅删除数组的第一个元素
- 删除数组时断言失败
- 如何并行删除数组中的零值
- 访问指针数组/通过另一个指针并删除数组中的单个元素而不删除第一个指针或整个数组