C++ 在c+中具有一种以上排序方法的STL容器+;

C++ 在c+中具有一种以上排序方法的STL容器+;,c++,stl,C++,Stl,我正在寻找一个容器,包含像员工这样的对象(信息:姓名、薪水、电话……) 这将有可能一次按名称(a..z)排序,另一次按工资排序。 最好的方法是什么? 我考虑过地图,但后来我只定义了一个键 如果您有任何想法(请不要太高级!) ---更新--- 实际上,我不需要总是维护2个STL容器,我通常会有1个(比如员工按姓氏排序),根据要求,我不介意制作一个新的STL容器,并将所有元素再次推送到其中,只是这次按工资排序,所以我可以按顺序打印。是否可以使用名称排序创建map1,使用薪资排序创建map2?如果是,

我正在寻找一个容器,包含像员工这样的对象(信息:姓名、薪水、电话……) 这将有可能一次按名称(a..z)排序,另一次按工资排序。 最好的方法是什么? 我考虑过地图,但后来我只定义了一个键 如果您有任何想法(请不要太高级!)

---更新---


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

< p>使用这个版本的STD::排序< /P>
template <class RandomAccessIterator, class Compare>
void sort( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
模板
无效排序(首先是RandomAccessIterator,最后是RandomAccessIterator,比较comp);
您可以根据需要对任何字段进行排序,并提供自己的比较器。比如说

struct CompareSalary
{
  bool operator () ( const Employee& a, const Employee& b ) const
  {
    return a.salary < b.salary;
  }
}
struct CompareSalary
{
布尔运算符()(常数雇员&a、常数雇员&b)常数
{
返回a.薪资

另外,由于std::sort与提供随机访问迭代器的所有容器都兼容,因此std::vector将很好地发挥作用。

提供了一个函数来
std::sort

bool byName(Employee left, Employee right) {
    return left.name < right.name;
}

std::vector<Employee> employees;
std::sort(employees.begin(), employees.end(), byName);
bool byName(员工左,员工右){
返回left.name
基本上,您需要定义多个比较器,每个比较器的实现都满足不同的排序标准。菲利普·波特的文章给出了一个排序标准的例子。您可能想定义更多类似的内容


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

如果您希望两个排序条件同时可用,您还可以查看


PS:但是由于您提到C++是新的,所以我不建议使用Boost多索引。它的语法很难理解

您想让它们一直被排序吗?像std::map那样?(因此,您可以使用
*(coll.begin())
?)访问最低的元素)如果是这样,我要做的是有两个std::map,每个std::map都充满了
共享的ptr
,每个std::map都传递了自己的排序函数,每个排序函数对应一个排序条件。这样,您的数据类型就不局限于一个“小于”操作符,您可以得到O(logn)插入和删除(std::map只是一个二叉树),并且映射总是被排序的


但是,您必须同步添加和删除,以确保它们从两个映射中添加和删除。

我认为您需要
operator()
@Ferruccio,实际上这次不是。我正在传递一个指向byName的指针,而不是调用byName。我刚刚捕捉到它并删除了我的评论。我认为byName是一个函子。:-)@Philip:我会在参数中添加
const&
,无需触发复制构造函数进行简单比较。@Matthieu:很可能不会。在很多情况下,我已经养成了依赖复制省略的习惯,这通常不会让我失望。但是,使用
const&&
也没有理由需要左值:)(这是boost,不是stl,但是)除了添加/删除条目(不包括当时需要的调用)之外,这是访问以不同方式排序的数据的最有效方法。它有一个“时髦”的声明,但在遵循文档时并不太高级,使用它非常简单。您基本上是在重新发明10%的
boost::multi_index_container