显而易见的起点将是一个定义了operator<
的结构体:
struct data {
unsigned long long int number;
size_t index;
};
struct by_number {
bool operator()(data const &left, data const &right) {
return left.number < right.number;
}
};
...并使用std::vector来保存数据:
std::vector<data> items;
使用std::sort
进行排序:
std::sort(items.begin(), items.end(), by_number())
事实是,普通的容器(等等)已经足够高效,使用它们不会让你的代码显著变慢。也许你可以通过以不同的方式编写一些部分来取得更好的效果,但你可能也会轻易地变得更糟。从可靠且易读的角度出发,并进行测试--不要过早地尝试优化。
编辑:当然,在C++11中,你可以使用Lambda表达式代替:
std::sort(items.begin(), items.end(),
[](data const &a, data const &b) { return a.number < b.number; });
通常这样写会更方便。可读性取决于代码的复杂度——对于像这样简单的内容,我认为sort ... by_number
相当易读,但这还要取决于你给比较运算符命名的方式(非常)重要。Lambda使得实际排序标准更容易找到,因此您不需要精心选择名称才能使代码易读。