用于删除一系列值的STL容器

时间:2017-05-17 11:30:07

标签: c++ stl

我自己有n个整数。我收到了starting value(SV)ending value(EV),我需要删除这些值范围内的值。 n个整数的集合中可能不存在起始值和结束值。我需要在O(No. Of elements deleted)中进行此操作。整数vector之类的容器失败,因为我需要B.Search并获得大于等于SVEV的迭代器,这需要额外的时间Log n。任何方法都赞赏。

编辑:我甚至考虑使用地图,将值存储为键,并根据这些键值进行删除。但问题是lower_boundupper_bound操作发生在log时间。

3 个答案:

答案 0 :(得分:3)

如果您需要在容器中保留订单,请使用: set http://www.cplusplus.com/reference/set/set/ 如果值可以重复,则为multiset http://www.cplusplus.com/reference/set/multiset/

两者都具有lower_boundupper_bound功能。

答案 1 :(得分:0)

您可以使用erase-remove idiomstd::remove_if来检查每个值是否在两个边界之间。

#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> values = {1,2,3,4,5,6,7,8,9};
    int start = 3;
    int stop = 7;
    values.erase(std::remove_if(values.begin(),
                                values.end(),
                                [start, stop](int i){ return i > start && i < stop; }),
                 values.end());
    for (auto i : values)
    {
        std::cout << i << " ";
    }
}

Output

1 2 3 7 8 9  

答案 2 :(得分:0)

正如Marek R所说,有std::multiset

整个练习的复杂性是O(log(values.size()+ std :: distance(first,last)),其中该距离是'删除的元素数'。

很难看出你如何击败它。在它的最后总会有一些东西随着容器的大小而增加,并且它的记录是一个很好的协议!

#include <iostream>
#include <set>

void dump(const std::multiset<int>& values);

int main() {
    std::multiset<int> values;
    values.insert(5);
    values.insert(7);

    values.insert(9);
    values.insert(11);
    values.insert(8);
    values.insert(8);
    values.insert(76);

    dump(values);
    auto first=values.lower_bound(7);
    auto last=values.upper_bound(10);    
    values.erase(first,last);
    dump(values);

    return 0;
}

void dump(const std::multiset<int>& values){
    auto flag=false;
    std::cout<<'{';
    for(auto curr : values){
        if(flag){
            std::cout<<',';
        }else{
            flag=true;
        }
        std::cout<< curr;
    }
    std::cout<<'}'<<std::endl;
}