原文链接:https://blog.csdn.net/qq_40969467/article/details/90758281
https://blog.csdn.net/qq_23350817/article/details/100097881
一、实现从vector中过滤重复的数据
0、前言
相信有很有种情况下面要在vector下过滤掉重复的数据就比如在数组中需要过滤重复数据一样重要一般常用的方法,好像还是在学校中教的,进行匹配一遍,然后再进行插入既然有了STL容器,那么我们可以完全抛弃上面提到的一般方法,把效率提高至少1倍。
1、思路
map也是我们常用的一种容器,他主要的保存方式是,也就是通过key来进行索引,而且这个key是不重复的,那么在我们过滤的前提下,map就是成败的关键了,看看如何把它用好
2、容易陷入的错误
a、一想到容器,很容易想到使用迭代器(iterator),但是对于map,加入数据量大的时候,进行iterator的操作很慢很慢!
b、容易想到,先把数据都插入到map中,再最后直接在写入vector中,其实这样又回到了a中
3、流程分析
假设我们要存放N多的数据(假设是海量的),那么我们需要避免对map进行iterator的操作(很慢很慢!)
于是在数据插入的时候,我先去从map中find一下,加入map中并不存在这个key,那么我们放心的插入到map中,同时插入到vector中。总之,每一次想到要插入vector我都想到map.find、map.insert,那么最终的vector就是不存在重复的,也同时避免了在map中使用迭代器(iterator)。
4.分析
map查找某个元素方便,但遍历是弱项,所以用来充当过滤器; vec查找某个元素不方便,但遍历很快,用来储存很适合;
二、计算stl中重复元素个数的函数
可以使用count计算元素中重复元素个数
#include <iostream>
#include <bitset>
#include <vector>
using namespace std;
int main(int argc, char* argv)
{
bitset<8> bt;
bool ret = bt.any();
if (ret) {
cout << "True" << endl;
}
else {
cout << "False" << endl;
}
vector<int> vec{ 1, 2, 3, 1, 2, 2, 2, 3, 3, 3, 3 };
cout << count(vec.begin(), vec.end(), 3) << endl;
while (1);
return 0;
}
count在某些场合可以替换find使用。但是如果需要找到查找数据的位置时则必须使用find函数,count更强调查找元素出现的个数。
当如果需要清除容器中重复元素的时候,使用unique。很多场合就是先count计算是否有重复元素,如果有就先unique删除重复元素,然后使用sort对元素进行排序。