记录六:C++中对字符串数组vector<string>去重
对于字符串数组vector<string>去重,有以下三种方法(准确的是两种吧):(一)先排序、后去重采用sort函数 (头文件#include <algorithm>) —— 这时候vector容器元素是从小到大排序好的采用unique函数(头文件#include <algorithm>) —— 将容器中重复的
·
对于字符串数组vector<string>去重,有以下三种方法(准确的是两种吧):
(一)先排序、后去重
- 采用sort函数 (头文件#include <algorithm>) —— 这时候vector容器元素是从小到大排序好的
- 采用unique函数(头文件#include <algorithm>) —— 将容器中重复的元素放到vector的尾部,返回指向第一个重复元素的迭代器
- 采用vector自带的erase函数(头文件#include <vector>) —— 删除vector中的一段元素
具体代码如下↓
void DeleteDuplicated(vector<string> &name)
{
sort(name.begin(), name.end());
name.erase(unique(name.begin(), name.end()), name.end());
}
(二)利用set、unordered_set容器
- 因为这两个容器的关键字是唯一的
- 因此以元素是否能在unordered_set容器中插入成功作为判断依据
- 如果插入成功 就将该值赋给迭代器指向的下一个值 并将判断迭代器下移一位
具体代码如下↓
void remove(vector<string> &str)
{
vector<string>::iterator itr = str.begin();
unordered_set<string> s;
for (auto curr = str.begin(); curr != str.end(); ++curr)
{
if (s.insert(*curr).second)//判断是否能插入成功
{
*itr++ = *curr;//如果成功 就将当前的值赋给到当前迭代器的下一位
}
}
str.erase(itr, str.end());//循环完一遍后 当前迭代器的位置就是字段唯一值的末尾
}
(三)同样利用set、unordered_set容器
如果不是一定要用vector容器来装载字符串 可以考虑直接用set、unordered_set容器来存储!
目前从时间复杂度的角度上来说,第二种方法应该是最快的,其时间复杂度为O(n)。
会继续补充,找到效率最快、最高的方法....
(如果有请补充 哪里说错了也请指出!
更多推荐
已为社区贡献1条内容
所有评论(0)