C 列表一次由多个字段排序



我想知道是否有一个很好的方法可以使用两个或更多不同的标准同时排序的对象列表。因此,例如,如果我有一个课:

class Person {
    Person(const char *name, int age);
    float        age;
    char *       name;
    bool compareAge(person_t a) {return age < b.age;}
    bool compareName(person_t a) {return strcmp(name,a.name) < 0;}
};

我有一百万个名字。我想知道是否有任何常见的课程可以有一个人列表,这样我就可以快速迭代并按字母顺序或按年龄在此列表上进行搜索。因此,例如,我希望能够在查找之间进行以下操作:

const std::multiset<Person, 2> mySet;
mySet.setSortCriteria(1, Person::compareName);
mySet.setSortCriteria(2, Person::compareAge);
populateAndSort(&mySet);
Person firstJohn = mySet.findByCriteria(1, Person("John",0));
Person firstTeen = mySet.findByCriteria(2, Person("",13));

我可以用两个单独的分类的指针进行此操作,但理想情况下,我只想维护一个列表(因此,如果我想在20个标准上进行查找,我就不需要维护20个列表...)。到目前为止,我还没有找到任何参考,以做到这一点的好方法,但是,目前我对C 有些新来,很有可能我错过了一些东西。

在我们贫穷的世界中没有魔法...如果您希望根据不同的订单可以访问相同的列表,则需要维护多个索引。这就是数据库工作的方式:您通常有一个主要键,该密钥应该是 native 访问模式,以及允许在索引字段上快速搜索和订购的替代索引。在容器世界中,主要键将是主要容器的本机顺序,替代索引将是替代地图,如果用于订购的字段,则键,该值将是主要容器的迭代器 - 至少对于更改中没有无效迭代器的容器,例如列表和地图。

您可以自己滚动。几乎没有警告,主要在修改主容器的修改上正确地维护所有索引。或您在评论中建议您只使用Boost。

最新更新