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

如何比较二元组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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:06:03