能否更改 C++ std::set 的比较器?

5

我有一组数据,有时需要按一种方式排序,有时需要按另一种方式排序。例如,假设数据集是一组字符串,{"abc", "dfg",...}。有时我需要按字母顺序排序,有时按长度比较。

最初,我使用std::set作为我的数据容器,并实现了2个比较器,希望可以随时更改set的比较器,因为数据量很大,将其从一个set复制到另一个set不是一个好主意。我只想不时地使用不同的比较器进行排序。这是否可能,或者有什么正确的方法?

3个回答

7

在创建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。它可以帮助你更好地管理和组织数据,特别是在IT技术方面。

谢谢xtofl!正是我想要的。 - blurrcat

2
这个集合始终保持排序状态(否则就无法达到所需的性能),因此比较器不能更改。我认为最好的解决方案是使用两个具有相同数据但不同比较器的集合。我会将这两个集合封装在一个类中,并使插入等函数同时作用于两个集合,以确保两个集合上的数据相同。
如果您只需要在必要时按照所需的比较器对数据进行排序,则可以使用例如向量,并进行排序。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接