【问题标题】:Is it possible to change the comparator of a C++ std::set?是否可以更改 C++ std::set 的比较器?
【发布时间】:2011-10-15 12:29:14
【问题描述】:

我有一组数据,在某些情况下我需要以一种方式对它们进行排序,而在某些情况下需要以另一种方式进行排序。例如,假设数据集是一组字符串,{"abc", "dfg",...}。有时我需要按字母顺序对它们进行排序,有时还需要比较它们的长度。

最初我使用 std::set 作为我的数据的容器并实现了 2 个比较器,希望我可以动态更改集合的比较器,因为数据很大,复制它不是一个好主意一组到另一组..我只是想不时使用不同的比较器对其进行排序。这是可能的还是正确的方法是什么?

【问题讨论】:

    标签: c++ set comparator


    【解决方案1】:

    你必须在构造时指定std::set的比较器。

    作为一种解决方案,我将改为维护两个“索引”集,每个都引用实际的集合。这将产生最大的灵活性。为了将所有内容放在一起,我建议您将其封装在一个类中:

    // to be compiled, debugged etc..., but ideal
    // to grab  the idea
    // caveats: maintain the index objects whenever the collection
    // gets resized/reallocated etc...
    // so not to be written yourself, use an existing library :)
    template< typename T, typename comp1, typename comp2 >
    struct MultiIndex {
        std::deque<T> collection;
        std::set<T*, comp1> index1;
        std::set<T*, comp2> index2;
    
        void insert( const T& t ){
           collection.push_back(t);
           index1.insert( &collection.back() );
           index2.insert( &collection.back() );
        }
    };
    

    Boost 库有这样一个类:Multiindex

    【讨论】:

    • 感谢 xtofl!正是我想要的。
    【解决方案2】:

    该集合在内部始终保持排序(否则您将无法获得所需的性能),因此不,无法更改比较器。我认为这里最好的解决方案是使用相同的数据维护两组,但使用不同的比较器。我会将这两个集合封装在一个类中,并在两个集合上都有插入等功能,以确保两个集合上的数据相同。

    如果您只是不需要一直对数据进行排序,另一种完成您想要的方法就是简单地使用例如一个向量,并在必要时按您需要的任何比较器进行排序。

    【讨论】:

      【解决方案3】:

      不,不是即时的。树是根据构建时指定的排序标准构建的。您正在谈论将多个索引构建到单个数据集中,这可以通过多个集合来完成。可能有很多像 boost 这样的库已经为此创建了一些东西。

      【讨论】:

        猜你喜欢
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        • 1970-01-01
        • 2013-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多