C++中vector和set删除一亿个数字中的奇数
2015-04-18 19:07
232 查看
一、vector
先贴代码再解释:#include <iostream> #include <algorithm> #include <vector> #include <set> using namespace std; const unsigned int NUM = 100000000; void removeOdd1(vector<int>& a) { for(vector<int>::iterator it = a.begin();it!=a.end();) { if((*it)%2==1) { it = a.erase(it);//注意这里和set的区别,erase当前元素后面的元素会自动不过了所以不需要++了 } else { it++; } } } bool isOdd(unsigned int x) { if(x%2==1) { return true; } else { return false; } } void removeOdd2(vector<int>& a) { a.erase(remove_if(a.begin(), a.end(), isOdd),a.end()); } int main() { vector<int> a(NUM, 0); for(unsigned int i=0;i<NUM;++i) { a[i] = i; } // removeOdd1(a); removeOdd2(a); return 0; }一般情况下我们最直观的方法就是用方法一,对于小数据量这些都没有问题,但是数据量大时运行速度就不行了。这是因为vector其实是对数组的封装你每找到一个奇数就移除那么其后面的数据是要向前移动的也即是每次删除一个元素后面的每个元素就要移动一次。对于一亿的数据量我在我的笔记本上没有等到运行结果!对于方法二remove_if()函数的原理是把vector中的偶数拷贝到另一个个vector中(其实remove_if()是在同一个vector上操作的),也即a中前一段存的是偶数而后一段存的还是原理的值,remove_if()返回的是所有符合条件的数据的下一个位置,因此使用a.erase()擦除后面的数据。以下代码是对其进行的验证:
#include <iostream> #include <algorithm> #include <vector> #include <set> using namespace std; const unsigned int NUM = 10; bool isOdd(unsigned int x) { if(x%2==1) { return true; } else { return false; } } int main() { vector<int> a(NUM, 0); for(unsigned int i=0;i<NUM;++i) { a[i] = i; } vector<int>::iterator t = remove_if(a.begin(), a.end(), isOdd); a.erase(t, a.end()); for(vector<int>::iterator it = a.begin(); it<t; ++it) { cout << *it << endl; } cout << endl; for(vector<int>::iterator it=t; it<a.end(); ++it) { cout << *it << endl; } return 0; }
二、set
#include <iostream> #include <algorithm> #include <set> using namespace std; //const unsigned int NUM = 100000000; const unsigned int NUM = 100;//因这里建树比较慢所以取值小了点 void removeOdd1(set<int>& s) { for(set<int>::iterator it = s.begin(); it!=s.end();++it)//注意这里和vector的不同,即使erase当前元素迭代器还是要++ { if((*it)%2==1) { s.erase(it); } } } int main() { set<int> s; for(unsigned int i=0; i<NUM; ++i) { s.insert(i); } removeOdd1(s); return 0; }
set是使用红黑树实现的因此插入和删除操作都在lg(n)时间内完成,因此直接删除就可以了。set是一个集合适合查找元素,而vector是一个连续的内存空间可以随机存取。但从查找一个元素来看set的效率要比vector高。
1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2、如果你要查找一个元素是否在某集合内存中,则使用set存储这个集合比较好
相关文章推荐
- C++中vector和set删除一亿个数字中的奇数
- 腾讯笔试题--删除set与vector中QQ号为奇数的号码
- 用vector或者set删除一亿个数里的奇数
- c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
- 【C++学习】vector的使用,输入一串数字,输出相邻和---ShinePans
- c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑
- C++各个容器比较(vector,deque,list,set,map,queue,stack)
- C++ vector一边遍历一边删除元素
- C++中Vector的删除操作
- [C/C++标准库]_[初级]_[std::vector的删除元素]
- c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
- 文本查询程序(c++)set,vector,map容器实现
- c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑
- c++ 计蒜客第22题 排序后数组删除重复数字
- C++ list, vector, map, set 区别与用法比较
- C++ vector容器删除操作
- C++ STL容器的学习使用(vector、queue、list、set、map)
- C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
- C++中 vector、list、deque、set、map
- C++ vector 删除符合条件的元素