从STL中查找、统计和过滤重复(相同)的数据

原文链接: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对元素进行排序。
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子木呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值