在vector中高效删除数据
源码
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <ctime>
#include "stdlib.h"
using namespace std;
// 判断成绩是否及格
bool pgrade(double x)
{
if(x>=60)
return true;
else
return false;
}
// 判断成绩是否不及格
bool fgrade(double x)
{
return !pgrade(x);
}
int main()
{
vector<double> grades_tmp, grades, fail, pass;
vector<double>::iterator iter;
clock_t time_start, time_end;
// 在0到100中随机生成75000个成绩
for (int i=0; i<75000; i++)
grades_tmp.push_back(rand()%100);
// 循环所有元素,取出不及格成绩后erase
grades.assign(grades_tmp.begin(), grades_tmp.end());
time_start = clock();
iter = grades.begin();
while (iter < grades.end())
{
if(fgrade(*iter))
{
fail.push_back(*iter);
iter = grades.erase(iter);
}
else
iter++;
}
pass.assign(grades.begin(), grades.end());
time_end = clock();
cout << "erase time is: " << double(time_end-time_start) << endl;
// 两次访问,取出及格和不及格成绩(使用remove_copy_if和remove_if)
grades.clear();
fail.clear();
pass.clear();
grades.assign(grades_tmp.begin(), grades_tmp.end());
time_start = clock();
remove_copy_if(grades.begin(), grades.end(), back_inserter(fail), pgrade);
grades.erase(remove_if(grades.begin(), grades.end(), fgrade), grades.end());
pass.assign(grades.begin(), grades.end());
time_end = clock();
cout << "twice visit: " << double(time_end-time_start) << endl;
//一次访问,取出及格和不及格成绩(使用stable_partition)
grades.clear();
fail.clear();
pass.clear();
grades.assign(grades_tmp.begin(), grades_tmp.end());
time_start = clock();
iter = stable_partition(grades.begin(), grades.end(), pgrade);
fail.assign(iter,grades.end());
grades.erase(iter,grades.end());
pass.assign(grades.begin(), grades.end());
time_end = clock();
cout << "single visit: " << double(time_end-time_start) << endl;
}
代码解释
遍历所有元素,使用erase删除元素
两次访问grades,使用remove_copy_if和remove_if删除元素
一次访问grades,使用stable_partition删除元素