vector中高效删除元素

在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删除元素

猜你喜欢

转载自www.cnblogs.com/uarekoalaiamtree/p/10897150.html