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

如何修复为std::minmax编写vector<glm::vec3>自定义比较器时的C2664错误?

修复std::minmax调用的类型错误问题

你的问题根源在于用错了标准库函数:std::minmax是用来比较两个独立值或者初始化列表的,并不接受迭代器范围作为输入。你真正需要的是std::minmax_element——它专门处理容器的迭代器范围,返回指向最小和最大元素的迭代器对。

为什么会出现C2664错误?

当你给std::minmax传入迭代器时,编译器会把迭代器本身当作要比较的元素类型(错误信息里的_Ty就是迭代器类型),但你的自定义比较器期望的是glm::vec3类型的参数,自然就会触发"无法从迭代器转换为const glm::vec3"的类型错误。

修复步骤

  1. 替换函数:把std::minmax改成std::minmax_element。
  2. 确认比较器逻辑:你的比较器comp返回first.y > sec.y,这意味着在排序规则中,y值更大的元素会被视为"更小"的一方(因为标准库比较器的规则是:返回true表示第一个参数应该排在第二个参数前面,即被认为小于第二个)。所以std::minmax_element返回的第一个迭代器会指向y最大的元素,第二个指向y最小的。如果你的需求是找到y最小和y最大的元素,需要把比较器改成return first.y < sec.y;。

修正后的代码示例

情况1:找y值最小和最大的元素

// 自定义比较器:按y值升序比较
bool comp(glm::vec3 const & first, glm::vec3 const & sec) {
    return first.y < sec.y;
}

// 调用代码
const std::vector<glm::vec3> verts = mesh.getVertices();
auto minmax = std::minmax_element(std::begin(verts), std::end(verts), comp);

// 访问结果
const glm::vec3& min_y_vertex = *minmax.first;  // y最小的顶点
const glm::vec3& max_y_vertex = *minmax.second; // y最大的顶点

情况2:用Lambda简化(无需单独写comp函数)

如果不想单独定义比较器函数,可以直接用lambda表达式,代码更紧凑:

const std::vector<glm::vec3> verts = mesh.getVertices();
auto minmax = std::minmax_element(verts.begin(), verts.end(),
    [](const glm::vec3& a, const glm::vec3& b) {
        return a.y < b.y; // 按y升序,按需改成a.y > b.y
    });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:24:17