按属性对对象列表进行排序

3

我完全被卡住了,查看示例也没有帮助我使这个排序函数工作:

void sortRegistryByName(std::list<Transcript>& registry) {
   std::sort(registry.begin(), registry.end(), [](const Transcript &f, const Transcript &s) { return f.name < s.name; }); 
}

以上代码应该按照它们的名称属性对字幕列表进行排序。

而字幕内容如下:

typedef struct Transcript_t {
    std::string name; // Name of the transcript
    std::string student_id;
    std::list<std::pair<std::string, size_t>> grades; // List of (course, grade) pairs
} Transcript;

当我尝试编译这个程序时,sort函数会导致大量错误,与safe_iterators和operators有关。

有人发现了什么非常愚蠢的错误吗?我看不到它。


1
std::sort 需要随机访问迭代器,而 std::list 只提供双向迭代器。不过,它有一个成员函数 .sort(http://en.cppreference.com/w/cpp/container/list/sort)可以使用。 - Xeo
我不明白为什么你在这里使用 size_t - std::list<std::pair<std::string, size_t>> grades;,考虑到它的上下文,你可能最好使用 std::map<std::string, int> - 假设不会有重复的课程。 - Aesthete
很遗憾,那部分不是我的设计。这是我现在正在学习的一门课程的练习,而且成绩单已经按照这样的方式给出了。 - user2806423
1个回答

7

由于std::list没有随机访问迭代器,因此您需要调用其sort函数:

std::list<Transcript> registry;
registry.sort([](const Transcript &f, const Transcript &s) { return f.name < s.name; });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接