我有一组数据,有时需要按一种方式排序,有时需要按另一种方式排序。例如,假设数据集是一组字符串,{"abc", "dfg",...}。有时我需要按字母顺序排序,有时按长度比较。
最初,我使用std::set作为我的数据容器,并实现了2个比较器,希望可以随时更改set的比较器,因为数据量很大,将其从一个set复制到另一个set不是一个好主意。我只想不时地使用不同的比较器进行排序。这是否可能,或者有什么正确的方法?
我有一组数据,有时需要按一种方式排序,有时需要按另一种方式排序。例如,假设数据集是一组字符串,{"abc", "dfg",...}。有时我需要按字母顺序排序,有时按长度比较。
最初,我使用std::set作为我的数据容器,并实现了2个比较器,希望可以随时更改set的比较器,因为数据量很大,将其从一个set复制到另一个set不是一个好主意。我只想不时地使用不同的比较器进行排序。这是否可能,或者有什么正确的方法?
在创建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() );
}
};