c++ - 我想使用 set 删除重复元素并在插入时保持顺序

标签 c++ stl set

我想使用 set 来删除重复的元素并同时保持它们的顺序。所以我尝试更改比较参数,让它们按照插入的顺序排序。

#include <set>
#include <iostream>
using namespace std;


template <class T>
struct compare
{
    bool operator() (T x, T y) 
    {
        return true;
    }
};

void main()
{
    set<int,compare<int>> one;

    one.insert(5);
    one.insert(3);
    one.insert(9);
    one.insert(1);
    one.insert(5);
    one.insert(5);
}

来自 IDE 的表达式是 :invaild operator <

最佳答案

std::set 依靠比较器来保持严格的弱排序并确保每个值都是唯一的。您不能按插入顺序对 std::set 进行排序。

一个可能的解决方案是有两个容器,一个 std::set 包含唯一元素,一个 std::vector 索引保持它们被插入的顺序. vector 可能包含集合中的迭代器。

用自己的迭代器将这两个容器封装在您自己的类中可能会很方便。这是一个简单的实现:

class MySetIterator {
  std::vector<std::set<int>::iterator>::iterator pos;
public:
  MySetIterator(std::vector<std::set<int>::iterator>::iterator pos) : pos(pos) {}
  int operator*() { return **pos; }
  MySetIterator& operator++() { ++pos; return *this; }
  bool operator!=(const MySetIterator& rhs) { return pos != rhs.pos; }    
};

class MySet {
 std::set<int> vals;
 std::vector<std::set<int>::iterator> order;
public:
  void insert(int val) { 
    auto ret = vals.insert(val);
    if (ret.second)
      order.push_back(ret.first);
  }
  MySetIterator begin() { return {order.begin()}; }
  MySetIterator end() { return {order.end()}; }    
};

int main() {
  MySet my_set;

  my_set.insert(5);
  my_set.insert(3);
  my_set.insert(9);
  my_set.insert(1);
  my_set.insert(5);
  my_set.insert(5);
  for (int val : my_set)
      std::cout << val << " ";
}

关于c++ - 我想使用 set 删除重复元素并在插入时保持顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30418674/

相关文章:

c++ - gdb 函数从本地范围调用 std::vector 导致错误

c++ - 在 C++ 中,std::multiset 是否保持稳定的排序顺序?

c++ - set <T> vs set <T, comparator> (C++ 多态性)

c++ - 我的 C++ 代码给出了在代码中看不到的错误。错误是什么?

c++ - 将特定格式的字符串拆分为 float 和字符串

c++ - 智能指针 - 程序终止时的段错误

c++ - 在超过 1 个(多个) 'std::map' s 或 'std::set' s 中查找 key 的最佳方法?

java - 给一个arraylist另一个arraylist JAVA的值

c++ 使用 GetDIBits() 读取像素

c++ - BGR 到 YCrCb 导致 OpenCV 中的灰色图像