如何修复为std::minmax编写vector<glm::vec3>自定义比较器时的C2664错误?
修复std::minmax调用的类型错误问题
你的问题根源在于用错了标准库函数:std::minmax是用来比较两个独立值或者初始化列表的,并不接受迭代器范围作为输入。你真正需要的是std::minmax_element——它专门处理容器的迭代器范围,返回指向最小和最大元素的迭代器对。
为什么会出现C2664错误?
当你给std::minmax传入迭代器时,编译器会把迭代器本身当作要比较的元素类型(错误信息里的_Ty就是迭代器类型),但你的自定义比较器期望的是glm::vec3类型的参数,自然就会触发"无法从迭代器转换为const glm::vec3"的类型错误。
修复步骤
- 替换函数:把
std::minmax改成std::minmax_element。 - 确认比较器逻辑:你的比较器
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
相关产品推荐
相关产品推荐

