2012-05-13 2 views
-3

У меня есть следующий для наборас использованием STL контейнера UPPER_BOUND & LOWER_BOUND для карты

set<int> myset; 
set<int>::iterator it,itlow,itup; 

for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90 
itup=myset.upper_bound (50);     // 
cout << "upper_bound at position " << (*itup) << endl; 
//output: 60 

Как я сделать это на карту? я думаю, что программа ниже, кажется, использует первое значение карты вместо второго значения, поэтому я получаю ошибки.

Как установить его для использования второго значения?

map<int,int> myset; 
map<int,int>::iterator it,itlow,itup; 

for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90 
itup=myset.upper_bound (50);     // 
cout << "upper_bound at position " << (*itup).second << endl; 
//output: some random value returns 

Фактический код, который дает мне неправильные значения при использовании с картой, работает, когда я использую набор:

int x = 50; 

map<int,int> myset; 
//for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90 
myset[0] = 10; 
myset[2] = 20; 
myset[3] = 30; 
myset[4] = 40; 
myset[5] = 50; 
myset[6] = 60; 
myset[7] = 70; 


map<int,int>::iterator begin,upbound,lobound,it; 
    map<int,int>::reverse_iterator end; 
end = myset.rbegin(); 
begin = myset.begin(); 
upbound=myset.upper_bound(x); 
lobound=myset.lower_bound(x); 
lobound--; 

if(myset.size()==1) 
{ 
    cout << "upper_range = " << x <<endl; 
    cout << "lower_range = " << x <<endl; 

} 
else if(x == (*begin).second) 
{ 
    cout << "upper_range = " << (*upbound).second <<endl; 
    cout << "lower_range = " << end->second <<endl; 

} 
else if(x == end->second) 
{ 
    cout << "upper_range = " << (*begin).second <<endl; 
    cout << "lower_range = " << (*lobound).second <<endl; 

} 
else 
{ 
    cout << "start = " << (*begin).second <<endl; 
    cout << "end = " << end->second<<endl; 
    cout << "upper_range = " << (*upbound).second <<endl; 
    cout << "lower_range = " << (*lobound).second <<endl; 
} 
+3

'карта MYSET;' не знаю, как это компилирует , 'std :: map' содержит пару ключей, значений. Пожалуйста, разместите фактический код sample.not скопируйте вложенный материал. Поместите минималистский образец кода, который компилирует и демонстрирует вашу проблему. –

+0

в соответствии с запросом, отредактировано – mister

+0

Это явно не работает, как вы этого хотите. См. Определение [upper_bound] (http://www.sgi.com/tech/stl/Map.html). В нем говорится: 'Находит первый элемент, ключ которого больше k.'. Также 'upper_bound' относится к отсортированным структурам. Это не имеет значения для значений карты, которые не гарантируются для сортировки. – Vikas

ответ

2

Если вы хотите найти map для конкретного значения (не ключ), то вы необходимо последовательно перебирать по карте и проверять каждое значение, так как find(), lower_bound(), upper_bound() все используют ключ.

В размещенном коде, вы можете обменять value и key, что позволит вам искать map как предыдущий set обыскали:

myset[10] = 0; 
myset[20] = 2; 
myset[30] = 3; 
myset[40] = 4; 
myset[50] = 5; 
myset[60] = 6; 
myset[70] = 7; 
+0

нет какого-либо другого пути, а затем переключения? – mister

+0

Нет, если вы хотите использовать 'map :: find()', 'map :: lower_bound()' и т. Д. – hmjd

Смежные вопросы