You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用std::vector<int>::back作为std::ranges::sort投射参数是否可行?

问题解答

这段代码不能正常工作,核心原因是std::vector::back存在两个重载版本:

  • 非const成员函数:reference back();
  • const成员函数:const_reference back() const;

当直接传递&std::vector::back给std::sort时,编译器无法确定要选用哪个重载,因此抛出"unresolved overloaded function type"(未解析的重载函数类型)错误。std::sort的比较参数需要明确、无歧义的函数类型,而重载函数地址本身不具备这种明确性。

正确的解决方式

最直观且无歧义的写法是使用lambda表达式实现排序逻辑:

#include <vector>
#include <algorithm>

int main() {
    std::vector<std::vector<int>> vecs = {{1,3}, {2,1}, {3,2}};
    // 按子向量最后一个元素升序排序
    std::sort(vecs.begin(), vecs.end(), [](const std::vector<int>& a, const std::vector<int>& b) {
        return a.back() < b.back();
    });
    return 0;
}

如果坚持使用成员函数指针,需要通过模板参数明确指定重载版本,比如借助std::mem_fn绑定const版本:

#include <vector>
#include <algorithm>
#include <functional>

int main() {
    std::vector<std::vector<int>> vecs = {{1,3}, {2,1}, {3,2}};
    std::sort(vecs.begin(), vecs.end(), [](const auto& a, const auto& b) {
        return std::invoke(std::mem_fn(&std::vector<int>::back), a) < std::invoke(std::mem_fn(&std::vector<int>::back), b);
    });
    return 0;
}

内容的提问来源于stack exchange,提问作者user515430

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 23:26:02