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

如何用STL从string类型vector中获取保留原序的唯一元素?

用C++标准库筛选vector中唯一元素并保留原顺序

C++标准库没有提供直接完成该需求的单一函数,但可以通过组合现有算法和容器轻松实现核心逻辑——遍历原容器,只保留首次出现的元素,同时剔除后续重复项。

实现方法

最常用的方式是结合std::copy_if和std::unordered_set(或std::set):

  • std::unordered_set用于记录已出现的元素,平均O(1)的插入/查找效率更适配大多数场景
  • std::copy_if负责遍历原vector,仅将未出现过的元素复制到结果容器中

示例代码:

#include <vector>
#include <string>
#include <algorithm>
#include <unordered_set>

std::vector<std::string> keep_unique_in_order(const std::vector<std::string>& input) {
    std::vector<std::string> unique_elements;
    std::unordered_set<std::string> seen_elements;

    std::copy_if(input.begin(), input.end(), std::back_inserter(unique_elements),
        [&seen_elements](const std::string& str) {
            // insert返回的pair中,second为true表示元素是首次插入(未重复)
            return seen_elements.insert(str).second;
        });

    return unique_elements;
}

代码说明

  1. 初始化空的结果vectorunique_elements和用于去重的unordered_set
  2. std::copy_if遍历输入vector的每个元素
  3. lambda表达式中尝试插入当前元素到seen_elements:
    • 插入成功(元素未出现过)则返回true,该元素被复制到结果中
    • 插入失败(元素已存在)则返回false,该元素被跳过
  4. 最终结果vector保留了原输入的元素顺序,且仅包含首次出现的唯一元素

备选方案(针对有序场景)

如果需要同时维持元素的排序(而非原输入顺序),可以将std::unordered_set替换为std::set,但查找和插入的时间复杂度会变为O(log n),适合对有序性有要求的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:37:15