从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對元素進行排序。
?
總結
以上是生活随笔為你收集整理的从STL中查找、统计和过滤重复(相同)的数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++输入输出流进制转换
- 下一篇: 目标群体是什么意思_抖音代运营日常主要是