std::ranges::partial_sort_copy不同投影的用例及设计动机咨询
std::ranges::partial_sort_copy 不同投影的实用案例与设计动机
实用案例
案例1:筛选与排序规则分离
假设我们有存储员工信息的结构体:
struct Employee { std::string name; int hire_year; double salary; };
需求是从员工列表中选出薪资最高的5人,并存入目标容器,同时目标容器中的员工按入职年份从早到晚排序。
这里:
proj1指定为&Employee::salary,用于筛选阶段比较薪资,选出薪资最高的5个员工;proj2指定为&Employee::hire_year,用于在目标容器中对选出的员工按入职年份排序。
调用代码示例:
std::vector<Employee> employees = { /* 员工数据 */ }; std::vector<Employee> top_salary_employees(5); std::ranges::partial_sort_copy( employees.begin(), employees.end(), top_salary_employees.begin(), top_salary_employees.end(), std::ranges::less{}, &Employee::salary, &Employee::hire_year );
单次调用即可完成“按薪资筛选+按入职年份排序”两步逻辑,无需额外中间操作。
案例2:异构源与目标容器
假设源容器是std::vector<int>,需要选出最大的3个数字,转换成字符串后存入std::vector<std::string>,且目标中的字符串按长度排序(比如"99"长度2,排在"100"长度3之前)。
这里:
proj1使用默认的std::identity,直接比较源中int的大小,选出最大的3个;proj2用自定义投影返回字符串长度,作为目标容器的排序依据。
调用代码示例:
std::vector<int> nums = { 10, 99, 5, 100, 23 }; std::vector<std::string> result(3); std::ranges::partial_sort_copy( nums.begin(), nums.end(), result.begin(), result.end(), std::ranges::less{}, std::identity{}, [](const std::string& s) { return s.size(); } );
最终result中的元素为{"99", "10", "100"},符合按字符串长度排序的要求。
设计动机
- 分离筛选与排序逻辑:很多场景需要按一个规则筛选元素,再按另一个规则排序结果。双投影参数允许单次算法调用完成这两步,避免额外的中间容器或二次排序。
- 适配异构元素类型:当源、目标容器元素类型不同时,两个投影可分别适配各自类型,无需手动转换元素后再处理,简化代码流程。
- 提升API灵活性:允许用户独立控制筛选依据和目标排序规则,无需编写复杂的复合比较函数,让逻辑更清晰,也便于复用现有投影(如成员指针、预定义投影)。
内容的提问来源于stack exchange,提问作者MarkB
相关产品推荐
相关产品推荐

