2015-05-25 3 views
-1

Я хочу найти нет элементов, присутствующих в наборе перед нижней границей данного элемента, я думал об использовании арифметики указателя с помощью 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 в частности. Возможно, вы захотите увидеть мой ответ ниже. –