如何比较二元组vector与三元组vector,忽略第三字段查找匹配条目
C++代码修正方案
核心错误点
- 容器声明非法:
std::vector<std::pair<int, int>,int>写法错误,vector的第二个模板参数为内存分配器,不用于定义元素字段。三列数据可存储为std::vector<std::tuple<int, int, int>>,或嵌套pairstd::vector<std::pair<std::pair<int, int>, int>>。 - 插入方法错误:
push_back仅支持传入单个元素,需将三列数据打包为单个元素后再插入容器。 - 匹配逻辑错误:默认
std::find会全量匹配元素所有字段,要忽略第三列需使用std::find_if自定义匹配规则,仅比对前两列的pair值。 - 业务逻辑反转:原代码中
std::find == vec2.end()代表未找到匹配项,与“存在匹配则存入新vector”的需求相反。 - 缺失依赖:使用查找算法需要引入
<algorithm>头文件,cout未加std::命名空间前缀,函数缺少闭合大括号。
修正后完整代码
#include <iostream> #include <fstream> #include <vector> #include <algorithm> // 查找算法所需头文件 #include <tuple> // 用于存储三列数据 void duplicate() { std::ifstream in("Measured-Isotopes_C.txt"); if (!in.is_open()) { std::cout << "File is not exist" << std::endl; return; } std::vector<std::pair<int, int>> vec; int A, Z; while (in >> A && in >> Z) { vec.push_back(std::make_pair(A, Z)); } std::ifstream known("Iso-Dat.txt"); if (!known.is_open()) { std::cout << "File is not exist" << std::endl; return; } // 三列数据用tuple存储,顺序为A1, Z1, HL std::vector<std::tuple<int, int, int>> vec2; int A1, Z1, HL; while (known >> A1 && known >> Z1 && known >> HL) { // 将三列打包为tuple插入容器 vec2.emplace_back(A1, Z1, HL); } std::vector<std::tuple<int, int, int>> vec3; // 遍历两列数据的所有pair for (const auto& target_pair : vec) { // 用find_if自定义匹配规则,仅比对前两列 auto it = std::find_if(vec2.begin(), vec2.end(), [&target_pair](const auto& item) { return std::get<0>(item) == target_pair.first && std::get<1>(item) == target_pair.second; }); // 找到匹配项才存入结果 if (it != vec2.end()) { vec3.push_back(*it); std::cout << "\t found one: " << target_pair.first << " " << target_pair.second << std::endl; } } }
匹配逻辑说明
通过std::find_if传入lambda表达式作为匹配条件,遍历三列数据容器时,仅取出每个元素的前两个字段和目标pair比对,完全忽略第三个字段的数值,符合需求的匹配规则。如果数据量较大,也可以提前将三列数据的前两列存入std::unordered_set做哈希查找,优化查询效率。
内容的提问来源于stack exchange,提问作者Zachary Finger
相关产品推荐
相关产品推荐

