【Practice】去除vector里重复元素的方法比较
来源:互联网 发布:房屋户型设计软件 编辑:程序博客网 时间:2024/06/02 19:16
背景:构造一个无重复的白名单,之后要在里面进行二分查找。故要求名单有序,且无重复,并且要进行二分查找,所以要采用有:随机访问迭代器类型的容器。这类容器有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 successfullycout<<"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 successfullycout<<"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 successfullycout<<"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万行即可。
- 【Practice】去除vector里重复元素的方法比较
- vector中去除重复的元素
- NSArray去除重复元素的方法
- NSArray去除重复元素的方法
- NSArray去除重复元素的方法
- NSArray去除重复元素的方法
- NSArray去除重复元素的方法
- NSArray去除重复元素的方法
- NSArray去除重复元素的方法
- NSArray去除重复元素的方法
- NSArray去除重复元素的方法
- NSArray去除重复元素的方法
- 使用TreeSet去除字符串数组里的重复元素
- iOS数组去除重复的元素的4种方法
- C++学习之vector重复元素的去除和求vector中最大最小元素及其索引
- js去除重复元素的两种方法收藏
- js去除数组中的重复元素的好方法
- NSArray去除重复元素(对象)的方法
- super + w Ubuntu 12.04 super + w 失效解决办法
- 手动安装eclipse插件_安装adt插件_安装easylook插件
- js javascript 的闭包和跨域
- 递归入门_斐波那契数列
- POJ 3126 Prime Path
- 【Practice】去除vector里重复元素的方法比较
- Android开发
- POJ题库指南
- 51单片机IIC总线编程
- 对I2C总线的时钟同步和总线仲裁的深入理解
- C#同时播放两首音乐
- Ubuntu 10.04更新源大全
- WIN7下PS/2等键盘失灵无法使用的解决办法
- Android系统启动过程