原文地址:http://blog.youkuaiyun.com/corcplusplusorjava/article/details/45115057 向原作者致敬
一、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;
- }
- #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存储这个集合比较好