c++ - 如何删除 'all duplicated ' 值?

标签 c++ algorithm sorting vector stl

有很多删除重复值的教程,我都检查过了

喜欢

{1,2,3,4,1,2,3,4,5} -> {1,2,3,4,5}

通过使用 sort()、unique() 函数。

但是如果我想删除“所有重复的”值

喜欢

{1,2,3,4,1,2,3,4,5} -> {5}

如何实现?

我已手动将原始 vector 分成两部分,并逐个删除第一部分中的重复元素。

这是有道理的,但是如果原始 vector 变得很大,那么我就无法手动拆分原始 vector 。

最佳答案

这是一个使用 range-v3 的解决方案:

namespace rv = ranges::views;
    
ranges::sort(v);
   
auto res = v 
      | rv::group_by(std::equal_to{}) 
      | rv::filter([](auto r) { return ranges::size(r) == 1; }) 
      | rv::join
      | ranges::to<std::vector<int>>;

这是一个 demo .

这是一个使用 STL 的 O(n log(n)) 就地解决方案:

auto begin = v.begin(), end = v.end();
    
std::sort(begin, end);

while(begin != end)
  if (auto f = std::find_if(begin + 1, end, 
                 [begin](int i) { return i != *begin; });
      begin + 1 != f)  // if duplicate elements found
    end = std::move(f, end, begin);   // move them to the end
  else ++begin;
  
v.erase(end, v.end());

这是一个 demo .

关于c++ - 如何删除 'all duplicated ' 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62649664/

相关文章:

c++ - 基类中基类子类型的成员变量

c++ - 复古游戏: scaling all sprites or rather the entire canvas?

algorithm - 包含所有对象的最小区间

javascript - 如何对对象数组进行排序和切片

python - numpy中的插入排序?

c++ - Boost 文件系统weakly_canonical 无法解析没有父文件夹的相对路径

c++ - 访问超出范围的变量而不传递它们?

algorithm - 将两个单位区间数转换为另一个单位区间数的函数

python - 反转给定索引之间的数组

r - 按因子级别数对 R 数据框进行排序