2015-05-25 114 views
-1

我想在给定元素的下界之前找到set中没有元素,我想用指针运算和std :: set ::迭代器,因为他们的行为像指针,这里是我的尝试:如何统计std :: set中给定元素之前的元素数

set<int>q; 
set<int>::iterator curr; 
set<int>::iterator strt; 
l = num.size(); 
q.insert(num[l-1]); 
strt = q.begin(); 
temp = 1; 
int x; 
for(int i=l-2;i>=0;i--) 
{ 
    curr = q.lower_bound(num[i]); 
    if(curr == q.end()) 
     stats.push_back({temp,0}); 
    else 
    { 
     x = curr-strt;//ERROR 
     stats.push_back({x,temp-x}); 
    } 
    q.insert(num[i]); 
    temp++; 
} 

是有什么办法找出一套没有任何元素的存在之前下界一个给定的元素吗?

回答

1

您必须遍历整个集合从开始到您发现的点来计算元素的数量。有应该是一个library function

x = std::distance(strt, curr); 

算术像curr-strt只对随机访问迭代器,这里的计算可以在固定时间内进行定义。像distance这样的函数将适用于更一般的迭代器类型,但如果迭代器不直接支持该运算符,则可能会变慢。

+0

这是一个'O(n)',是否有其他方法时间复杂度较低或者是否还有更适合的容器? – Sab

+0

@Sab:根据你在做什么,排序的数组/矢量可能会更好。您可以使用'std :: lower_bound'等对数时间进行搜索,并在常量时间内查找迭代器距离。维护排序的顺序可能需要更多的工作。 –

+0

@MikeSeymour重要的是要注意,“你将不得不遍历整个集合从开始到你发现的点”不是一般平衡树的属性,特别是STL树。您可能想在下面看到我的答案。 –

相关问题