在c ++中使用多个排序方法的STL容器

时间:2010-09-02 13:10:22

标签: c++ stl

我正在寻找一个容器,包含像Employee这样的对象(信息:姓名,工资,电话......) 这可以通过名称(a..z)对其进行排序,然后根据工资对其进行排序。 最好的方法是什么? 我想到了地图,但后来我只定义了一把钥匙 我会很感激每一个想法(请不要太高级!)

---更新---

我实际上不需要总是维护2个STL容器,我通常会有1个(比如按姓氏排序的员工),根据要求,我不介意制作新的STL容器,并推送所有元素再次,只有这一次按工资排序,所以我可以按顺序打印。是否可以使用名称排序创建map1,使用薪水排序创建map2?如果是这样的话会喜欢进一步的解释\例子来定义这两个地图。我的c ++知识很少(我得到的第一个任务)

5 个答案:

答案 0 :(得分:17)

使用此版本的std :: sort

template <class RandomAccessIterator, class Compare>
void sort( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

你可以对你想要的任何领域进行排序,提供你自己的比较器。例如

struct CompareSalary
{
  bool operator () ( const Employee& a, const Employee& b ) const
  {
    return a.salary < b.salary;
  }
}

此外,由于std :: sort与提供随机访问迭代器的所有容器兼容,因此std :: vector也可以。

答案 1 :(得分:8)

如果您希望两个排序标准同时可用,您还可以查看Boost MultiIndex

Ps:但是既然你提到你是c ++的新手,我就不推荐使用Boost MultiIndex。很难理解它的语法

答案 2 :(得分:6)

std::sort

提供功能
bool byName(Employee left, Employee right) {
    return left.name < right.name;
}

std::vector<Employee> employees;
std::sort(employees.begin(), employees.end(), byName);

答案 3 :(得分:0)

基本上,您需要定义多个比较器,每个比较器都实现为满足不同的排序标准。 Philip Potter的帖子给出了一个排序标准的例子。你可能想要定义更多这样的东西。

重载less运算符将使您能够仅使用前两个参数使用std :: sort方法,但您将仅限于一个排序条件。

答案 4 :(得分:0)

您希望它们始终排序吗?像std :: map一样吗? (所以你可以使用*(coll.begin())访问最低元素?)如果是这样,我会做的是有两个std :: map,每个都有shared_ptr<T>个,每个都传递给它自己的排序仿函数,每个排序标准一个。这样,您不仅限于数据类型的单个“小于”运算符,您可以获得O(log n)插入和删除(std :: map只是一个二叉树),并且映射始终是排序的

然而,您必须同步添加和删除,以确保它们已从两个地图中添加和删除。