我自己有n
个整数。我收到了starting value(SV)
和ending value(EV)
,我需要删除这些值范围内的值。 n个整数的集合中可能不存在起始值和结束值。我需要在O(No. Of elements deleted)
中进行此操作。整数vector
之类的容器失败,因为我需要B.Search并获得大于等于SV
和EV
的迭代器,这需要额外的时间Log n
。任何方法都赞赏。
编辑:我甚至考虑使用地图,将值存储为键,并根据这些键值进行删除。但问题是lower_bound
和upper_bound
操作发生在log
时间。
答案 0 :(得分:3)
如果您需要在容器中保留订单,请使用:
set
http://www.cplusplus.com/reference/set/set/
如果值可以重复,则为multiset
http://www.cplusplus.com/reference/set/multiset/。
两者都具有lower_bound
和upper_bound
功能。
答案 1 :(得分:0)
您可以使用erase-remove idiom和std::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 << " ";
}
}
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;
}