一、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存储这个集合比较好