如何利用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
相关产品推荐
相关产品推荐

