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

如何利用STL获取字符串中不重复且保留原始顺序的字符?

如何利用STL获取字符串中不重复且保留原始顺序的字符?

嘿,这个问题问得好!确实std::set和std::unordered_set虽然能帮我们提取唯一字符,但会打乱原本的顺序,挺让人头疼的。不过咱们可以用STL的算法结合一个辅助容器来搞定,完全不用手动写循环,够优雅~

这里给你一个简洁的实现思路:用std::copy_if算法遍历原字符串,同时借助一个std::unordered_set(或者std::set,前者效率更高)来记录已经出现过的字符。只有当字符是第一次出现时,才把它复制到结果字符串里,这样既能去重又能完美保留原始顺序。

直接上代码示例:

#include <iostream>
#include <string>
#include <algorithm>
#include <unordered_set>

int main() {
    std::string input = "geEksforGEeks";
    std::string unique_ordered;
    std::unordered_set<char> seen_chars;

    // 用copy_if筛选出首次出现的字符
    std::copy_if(input.begin(), input.end(), std::back_inserter(unique_ordered),
        [&seen_chars](char c) {
            // insert返回的pair中,第二个值表示是否成功插入(即字符未出现过)
            return seen_chars.insert(c).second;
        });

    std::cout << unique_ordered << std::endl; // 输出:geEksforG
    return 0;
}

简单解释一下:

  • std::copy_if负责遍历原字符串的每个字符,判断条件由lambda表达式提供
  • lambda里调用seen_chars.insert(c).second,因为unordered_set::insert会返回一个pair,其中第二个元素是布尔值:如果字符之前没出现过,插入成功就返回true,这个字符就会被复制到结果里;如果已经存在,返回false,就跳过这个字符
  • std::back_inserter用来自动把符合条件的字符追加到结果字符串末尾,不用手动管理内存

如果你对顺序容器的迭代器更熟悉,也可以用std::find来检查字符是否已经在结果里,但那样时间复杂度会变成O(n²),当字符串很长时效率会很低。而用unordered_set的话,插入和查找的平均时间复杂度是O(1),整体效率是O(n),显然更优。

备注:内容来源于stack exchange,提问作者Nick Gris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 11:27:59