我正在寻找一个容器,包含像Employee这样的对象(信息:姓名,工资,电话......) 这可以通过名称(a..z)对其进行排序,然后根据工资对其进行排序。 最好的方法是什么? 我想到了地图,但后来我只定义了一把钥匙 我会很感激每一个想法(请不要太高级!)
---更新---
我实际上不需要总是维护2个STL容器,我通常会有1个(比如按姓氏排序的员工),根据要求,我不介意制作新的STL容器,并推送所有元素再次,只有这一次按工资排序,所以我可以按顺序打印。是否可以使用名称排序创建map1,使用薪水排序创建map2?如果是这样的话会喜欢进一步的解释\例子来定义这两个地图。我的c ++知识很少(我得到的第一个任务)
答案 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只是一个二叉树),并且映射始终是排序的
然而,您必须同步添加和删除,以确保它们已从两个地图中添加和删除。