list::sort()只能对整个链表排序且不支持自定义迭代器范围,必须调用成员函数my_list.sort()或my_list.sort(comp),而std::sort因要求随机访问迭代器无法用于list。
list::sort() 只能对自身排序,不支持传入自定义比较器以外的迭代器范围
std::list 的 sort() 是成员函数,不是泛型算法 —— 这意味着你不能像 std::sort(first, last, comp) 那样传入任意迭代器对。它只能对整个链表排序,且必须调用在 list 对象上:my_list.sort() 或 my_list.sort(comp)。
常见错误是试图写 std::sort(my_list.begin(), my_list.end()),这会编译失败:因为 std::sort 要求随机访问迭代器,而 list::iterator 是双向迭代器,不支持 +、[] 等操作。
- ✅ 正确:
my_list.sort();(升序,要求T有operator) - ✅ 正确:
my_list.sort([](const auto& a, const auto& b) { return a > b; });(降序) - ❌ 错误:
std::sort(my_list.begin(), my_list.end());(编译报错:no match for ‘operator-’)
排序稳定性:list::sort() 是稳定排序,但 std::sort 不是(不过你根本不能对 list 用它)
std::list::sort() 在 C++11 起保证稳定 —— 相等元素的相对顺序不变。这点比 std::sort(对 vector 等)更可靠,尤其当你依赖插入顺序语义时。
但要注意:稳定性只在你用的比较逻辑真正“区分相等”时才有意义。比如两个 Person 对象按年龄排序,年龄相同但姓名不同,稳定性能保姓名原始次序;但如果比较器把它们全视为“相等”,那结果就不可控了。
立即学习“C++免费学习笔记(深入)”;