C++ tuple向量使用lower_bound自定义比较器出现get<0>匹配错误
问题根因
你没有包含<tuple>标准头文件。std::get针对std::tuple的特化重载定义在<tuple>头中,当前你引入的头文件里只有std::pair版本的std::get实现,所以调用时找不到匹配的函数,触发编译报错。
修复方案
- 首先在代码头部添加
<tuple>头引入:
#include <tuple>
- 修正代码中其他的逻辑错误:
max_end变量未定义,需要补充定义该变量的取值- 输出语句里的
low、v变量不存在,应该替换为实际定义的迭代器up和容器pieces,也就是改为(up - pieces.begin()) std::lower_bound要求作用于已按比较规则升序排序的序列,当前的pieces容器没有排序,直接调用lower_bound会返回不符合预期的结果,调用前需要先执行排序
修复后可运行的完整代码
#include <iostream> #include <algorithm> #include <vector> #include <tuple> // 补充缺失的头文件 static bool sortbysec(const std::tuple<double, double, double, double> &a, const std::tuple<double, double, double, double> &b) { return (std::get<0>(a) < std::get<0>(b)); } int main() { std::vector<std::tuple<double, double, double, double>> pieces; double max_end = 20.0; // 补充缺失的变量定义,可根据需求修改取值 pieces.push_back(std::make_tuple(10.0,22.2,30.3,227)); pieces.push_back(std::make_tuple(12.0,20.2,30.3,228)); pieces.push_back(std::make_tuple(228,20.2,30.3,228)); pieces.push_back(std::make_tuple(221,20.2,30.3,228)); // 先按自定义规则排序 std::sort(pieces.begin(), pieces.end(), sortbysec); std::vector<std::tuple<double, double, double, double>>::iterator up; up = std::lower_bound(pieces.begin(), pieces.end(), std::make_tuple(max_end, -1, -1, -1), sortbysec); std::cout << "lower_bound at position " << (up - pieces.begin()) << '\n'; return 0; }
内容的提问来源于stack exchange,提问作者Juno
相关产品推荐
相关产品推荐

