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

C++中如何将源Vector中Key不存在于目标Vector的元素复制到目标Vector

解决方案:合并vector并过滤重复key

嘿,这个需求其实很好实现,核心思路是先构建一个快速查找的key集合,再用std::copy_if过滤出需要的元素。下面是具体的实现步骤和代码:

第一步:构建已存在的key集合

为了避免每次检查key是否存在都遍历additional_data(时间复杂度会变成O(n*m)),我们先把additional_data里所有元素的key存入一个std::unordered_set——它的查找操作是O(1)的,能大幅提升效率。

第二步:用std::copy_if过滤并合并

通过std::copy_if遍历原data容器,只把那些key不在集合里的元素追加到additional_data末尾。

完整代码示例:

#include <vector>
#include <unordered_set>
#include <algorithm> // 用于std::copy_if

struct DataElement { 
    std::string key; 
    std::string value; 
    std::string placeholder; 
    // 其他数据成员 
};

// 假设这是你的create_additional_data函数
std::vector<DataElement> create_additional_data() {
    // 示例返回值
    return {{"key1", "val1", "p1"}, {"key2", "val2", "p2"}};
}

std::vector<DataElement> doAction(std::vector<DataElement>& data) { 
    auto additional_data = create_additional_data();

    // 收集已存在的key
    std::unordered_set<std::string> existing_keys;
    for (const auto& elem : additional_data) {
        existing_keys.insert(elem.key);
    }

    // 过滤并合并data中的元素
    std::copy_if(
        data.begin(), data.end(),
        std::back_inserter(additional_data),
        [&existing_keys](const DataElement& elem) {
            // 检查当前元素的key是否未在集合中
            return existing_keys.find(elem.key) == existing_keys.end();
        }
    );

    return additional_data; 
}

额外说明

  • 如果你的C版本是C20及以上,还可以用更简洁的范围写法来收集key:
    std::unordered_set<std::string> existing_keys;
    std::ranges::copy(additional_data | std::views::transform(&DataElement::key),
                      std::inserter(existing_keys, existing_keys.begin()));
    
  • 这个方案会保持data中元素的原有顺序,所有符合条件的元素都会追加到additional_data的末尾。
  • 如果DataElement的复制操作开销较大,可以考虑用std::move_if_noexcept或者调整逻辑进行移动,但这需要根据你的实际场景判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:44:04