C++ 是否可以更改C+的比较器+;设置?

C++ 是否可以更改C+的比较器+;设置?,c++,set,comparator,C++,Set,Comparator,我有一组数据,在某些情况下,我需要以一种方式对它们进行排序,在某些情况下,我需要以另一种方式对它们进行排序。例如,假设数据集是一组字符串,{“abc”、“dfg”、…}。有时我需要按字母顺序对它们进行排序,有时需要比较它们的长度 最初,我使用std::set作为数据容器,并实现了2个比较器,希望我可以动态更改集合的比较器,因为数据很大,从一个集合复制到另一个集合不是一个好主意。我只是想不时使用不同的比较器对其进行排序。这是可能的还是正确的方法?您必须在构建时指定std::set的比较器 作为解决

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


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

您必须在构建时指定
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() );
    }
};
//需要编译、调试等,但非常理想
//抓住这个主意
//注意事项:每当集合
//调整/重新分配大小等。。。
//因此,不要自己编写,请使用现有库:)
模板
结构多索引{
标准:德克收集;
std::set index1;
std::set index2;
无效插入(常数T&T){
收集。推回(t);
index1.insert(&collection.back());
index2.insert(&collection.back());
}
};

Boost库有这样一个类:。

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


如果您不需要一直对数据进行排序,那么另一种实现您所需的方法就是简单地使用一个向量,并在必要时按所需的比较器进行排序。

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

谢谢xtofl!正是我想要的。