【C++】去除vector里重复元素的方法比较
背景:构造一个无重复的白名单,之后要在里面进行二分查找。故要求名单有序,且无重复,并且要进行二分查找,所以要采用有:随机访问迭代器类型的容器。这类容器有vector,array,deque。显然要vector和deque合适一点,但是deque并没有体现出其两端和中间插入时间为固定而非线性的优势,因为本例都在尾部插入,vector和deque同为固定时间。而deque的随机存储操作时间长,故采用vector。
一.利用STL算法unique
首先要将vector排序,排序后。利用erase配合unique算法。利用一个含有一百万整数,里面重复数字并不太多的情况测试。
- #include<fstream>
- #include<iostream>
- #include <vector>
- #include<algorithm>
- #include<ctime>
- using namespace std;
- void main()
- {
- ifstream fwhite;
- int number;
- vector<int> white_list;
- clock_t cost;
- fwhite.open("largeW.txt");
- if(!fwhite.is_open())
- {//or use .good .fail or directly use ! to judge if the file has been opened successfully
- cout<<"can't open file list"<<endl;
- exit(EXIT_FAILURE);
- }
- cost=clock();
- while(!fwhite.eof())
- {
- fwhite>>number;
- white_list.push_back(number);
- }
- cost=clock()-cost;
- cout<<"Time to load data : "<<cost<<endl;
- sort(white_list.begin(),white_list.end());
- white_list.erase(unique(white_list.begin(),white_list.end()),white_list.end());
- cost = clock()-cost;
- cout<<"Time to remove reduplicative data from vector : "<<cost<<endl;
- ofstream fout("sort_white.txt",ios::trunc);
- vector<int>::iterator iter=white_list.begin();
- while (iter!= white_list.end())
- {
- fout<<*iter<<endl;
- iter++;
- }
- cost = clock()-cost;
- cout<<"Time to write data into file : "<<cost<<endl;
- exit(EXIT_SUCCESS);
- };
二.利用set配合copy
读数据的时候就用set,然后直接拷贝到vector。但是拷贝的时候要用到insert_iterator来进行插入拷贝。(溢出问题)
- #include<fstream>
- #include<iostream>
- #include <vector>
- #include<set>
- #include<algorithm>
- #include<ctime>
- #include <iterator>
- using namespace std;
- void main()
- {
- ifstream fwhite;
- int number;
- vector<int> white_list;
- set<int> ori_list;
- clock_t cost;
- fwhite.open("largeW.txt");
- if(!fwhite.is_open())
- {//or use .good .fail or directly use ! to judge if the file has been opened successfully
- cout<<"can't open file list"<<endl;
- exit(EXIT_FAILURE);
- }
- cost=clock();
- while(!fwhite.eof())
- {
- fwhite>>number;
- ori_list.insert(number);
- }
- cost=clock()-cost;
- cout<<"Time to load data : "<<cost<<endl;
- insert_iterator<vector<int> > it(white_list,white_list.begin());
- copy(ori_list.begin(),ori_list.end(),it);
- cost = clock()-cost;
- cout<<"Time to copy data from set to vector : "<<cost<<endl;
- ofstream fout("sort_white.txt",ios::trunc);
- vector<int>::iterator iter=white_list.begin();
- while (iter!= white_list.end())
- {
- fout<<*iter<<endl;
- iter++;
- }
- cost = clock()-cost;
- cout<<"Time to write data into file : "<<cost<<endl;
- exit(EXIT_SUCCESS);
- };
三.时间开销从开始构造容器开始,利用clock计时
第一种耗时:8.477秒
第二种耗时:23.246秒
看出,还是直接用vector就好,然后配合unique好。原因:同样插入100万个整数,set用时过长,经测试用去了约18秒。为主要开销。
第一种:读取文件到vector开销5.852秒,排序并去除重复元素开销3.205秒,写文件开销15.624秒。总耗时约24秒左右。
第二种:读文件到set开销18.893秒,从set拷贝数据到vector开销4.884秒,写文件开销20秒。总耗时约44秒左右。
但是看出程序写文件很慢,本例中采用iterator迭代取值写文件,如果直接采用索引下标会不会更快?或者采用copy函数和stream_interator?
四.在一的基础上,最后写文件时采用下标而不是迭代器
发现并无明显改进。
五.采用统一复制,配合ostream_iterator使用,在此例中速度缩短近一半。
- #include<fstream>
- #include<iostream>
- #include <vector>
- #include<algorithm>
- #include<ctime>
- #include <iterator>
- using namespace std;
- void main()
- {
- ifstream fwhite;
- int number;
- vector<int> white_list;
- clock_t cost;
- fwhite.open("largeW.txt");
- if(!fwhite.is_open())
- {//or use .good .fail or directly use ! to judge if the file has been opened successfully
- cout<<"can't open file list"<<endl;
- exit(EXIT_FAILURE);
- }
- cost=clock();
- while(!fwhite.eof())
- {
- fwhite>>number;
- white_list.push_back(number);
- }
- cost=clock()-cost;
- cout<<"Time to load data : "<<cost<<endl;
- sort(white_list.begin(),white_list.end());
- white_list.erase(unique(white_list.begin(),white_list.end()),white_list.end());
- cost = clock()-cost;
- cout<<"Time to remove reduplicative data from vector : "<<cost<<endl;
- ofstream fout("sort_white.txt",ios::trunc);
- /*vector<int>::iterator iter=white_list.begin();
- while (iter!= white_list.end())
- {
- fout<<*iter<<endl;
- iter++;
- }*/
- //for(unsigned int index = 0;index< white_list.size();index++)
- //{
- // fout<<white_list[index]<<endl;
- //}
- copy(white_list.begin(),white_list.end(),ostream_iterator<int,char>(fout,"\n"));
- cost = clock()-cost;
- cout<<"Time to write data into file : "<<cost<<endl;
- exit(EXIT_SUCCESS);
- };
另外:largeW文件是从《算法4》的网站得到的,或者可以采用rand函数先自己制造一个。每行一个int型整数,100万行即可。
【C++】去除vector里重复元素的方法比较的更多相关文章
- python去除列表中重复元素的方法
列表中元素位置的索引用的是L.index 本文实例讲述了Python去除列表中重复元素的方法.分享给大家供大家参考.具体如下: 比较容易记忆的是用内置的set 1 2 3 l1 = ['b','c', ...
- php 去除数组中重复元素
去除数组中重复元素, 找了下可以一下两个函数 php array_flip()与array_uniqure() $arr = array(…………) ;// 假设有数组包含一万个元素,里面有重复的元素 ...
- 引用vector里的元素被删除后,引用会怎么样?
引用的定义不多说,直接看做变量的别名就可以了.有一天写着写着代码,突然想到,如果对vector里某个元素设置引用后,将这个元素从vector里删除会怎么样?我思考了下,认为那个元素会被删除,但是引用还 ...
- java去除数组重复元素的方法
转载自:https://blog.csdn.net/Solar24/article/details/78672500 import java.util.ArrayList; import java.u ...
- js判断数组里是否有重复元素的方法
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/longzhoufeng/article/details/78840974 第一种方法:但是下面的这种 ...
- pyhon 去除列表中重复元素
Python set() 函数 描述 set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集.差集.并集等. 语法 set 语法: class set([iterabl ...
- JS判断数组中是否有重复元素的方法
判断数组中是否有重复元素,最容易想到的方法是使用2重循环,逐个遍历,比较,但是这个是最慢,最笨的方法,百度得出了更好的方法. var ary = new Array("111",& ...
- 利用filter,巧妙地去除Array的重复元素
var r, arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry']; r ...
- ArrayList中重复元素处理方法.[Java]
1.使用HashSet删除ArrayList中重复的元素 private static void sortByHashSet() { ArrayList<String> listWithD ...
随机推荐
- PAT甲级——A1052 Linked List Sorting
A linked list consists of a series of structures, which are not necessarily adjacent in memory. We a ...
- netbeans 8.2 系统找不到指定的文件。
系统找不到指定的文件.Using CATALINA_BASE: "C:\Users\wishr\AppData\Roaming\NetBeans\8.2\apache-tomcat-8.0. ...
- [转载] DDK中VPORT Mini-Driver的使用说明
学习下. 原文地址:DDK中VPORT Mini-Driver的使用说明作者:跳皮筋的小老鼠 要使用TI DDK中实现的VPORT驱动程序,首先需要在程序中提供VPORT_PortParams类型的参 ...
- java 实现文件内容的加密和解密
package com.umapp.test; import java.io.FileInputStream; import java.io.FileOutputStream; import java ...
- 在Linux中常用的启动引导工具:grub和lilo
在Linux和WINDOWS两系统并存时就需要安装GRUB(Grand Unified Bootloader),GRUB被广泛地用于替代lilo,GRUB支持在启动时使用命令行模式,支持md5加密保护 ...
- numpy.flatnonzero():
numpy.flatnonzero(): 该函数输入一个矩阵,返回扁平化后矩阵中非零元素的位置(index) 这是官方文档给出的用法,非常正规,输入一个矩阵,返回了其中非零元素的位置. 1 >& ...
- consul理解
假设consul软件安装在电脑ComputerA上,那么需要注册的服务ServiceA1也需要安装在电脑ComputerA上, 一个服务就是一个提供了ip+port(或者域名)的应用程序. 服务: 服 ...
- Ubuntu修改mysql编码格式
今天在Ubuntu系统上部署了第一个net core的web网站,遇到了mysql入库数据乱码的情况.无奈,ubuntu系统不熟悉,mysql命令不熟悉,只得在网上查找各种资料.还是老规矩,主要参考的 ...
- Git的基本了解与使用、向github提交代码
#Git的基本了解与使用.向github提交代码- git:是一个版本控制系统.- github:一个代码托管提供商.开源网站.是一个面向开源及私有软件项目的托管平台,因为支持Git作为唯一的版本库格 ...
- 面试Nginx的几个常见问题(
1.Nginx 服务器上的 Master 和 Worker 进程分别是什么 Master 进程:读取及评估配置和维持 Worker 进程:处理请求 2.怎么添加模块? Firstly, you h ...