如何用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; }
代码说明
- 初始化空的结果vector
unique_elements和用于去重的unordered_set std::copy_if遍历输入vector的每个元素- lambda表达式中尝试插入当前元素到
seen_elements:- 插入成功(元素未出现过)则返回
true,该元素被复制到结果中 - 插入失败(元素已存在)则返回
false,该元素被跳过
- 插入成功(元素未出现过)则返回
- 最终结果vector保留了原输入的元素顺序,且仅包含首次出现的唯一元素
备选方案(针对有序场景)
如果需要同时维持元素的排序(而非原输入顺序),可以将std::unordered_set替换为std::set,但查找和插入的时间复杂度会变为O(log n),适合对有序性有要求的场景。
内容的提问来源于stack exchange,提问作者lorem1213
相关产品推荐
相关产品推荐

