2014-02-14 3 views
0

Итак, вместо массива я решил использовать мультимап, чтобы я мог хранить повторяющиеся значения вместе с некоторым другим значением (которое действует как пара). Так что, когда я объявил мульти-карту какmultimap less_equal, приводящий к неправильным результатам поиска()

multimap<int,int,less_equal<int> > M; 
multimap<int,int,less_equal<int> >::iterator it,it2; 

А затем вставили все элементы в нем, говорят

(10,1), (2,2), (8,3), (2,2), (8,1) 

, а затем итерацию через него, я получил то, что я желал:

2 2 
2 2 
8 1 
8 3 
10 1 

Но теперь функция поиска просто не работает Как, если я хочу найти номер, скажем

it2=M.find(temp); 

где temp - некоторое значение, которое существует в мультимаре, скажем 8, оно просто игнорирует его и не находит его! Функция find работала, когда я не включал less_equal, но поскольку это то, что я хочу в своей программе, теперь я борюсь с моим кодом. Может ли кто-нибудь предложить средство для этого? Как причина, почему поиск не работает правильно?

+0

Подумайте об этом следующим образом: ТОЛЬКО действительный способ сравнения ключей состоит в использовании оператора, с которым вы проходите. Таким образом, ключ равен iff (! (Compare (a, b) || compare (b, a)) Как правило, сравнительный элемент, который вы проходите, меньше, поэтому вы получаете (! ((A IdeaHat

ответ

1

Компаратор должен определить строгий заказ; то есть он должен возвращать false при сравнении двух эквивалентных значений. В противном случае логика, зависящая от этого, потерпит неудачу. В частности, find(temp) ищет ключ эквивалентной temp, что удовлетворяет

!compare(key,temp) && !compare(temp,key) 

, не произойдет, если заказ не является строгим.

less (компаратор по умолчанию) является строгим; less_equal нет, поэтому не может быть использован.

+0

Это правда. Но когда я использую меньше, он дает результат на итерации, например, (2,3), (2 , 2), (8,2), (8,1), (10,1). Ключи не сортируются в том порядке, в котором я требую, чтобы они были в этом случае:/ –

+0

@AbbaShareen Кажется, ваш желаемый порядок зависит на значение также не только на ключе, что означает, что вы действительно не имеете карту от 'int' до' int', у вас есть набор пар int с определенным порядком. такой. – Angew

+0

Yup. Даже сейчас я чувствую себя мульти карта здесь бесполезна. Думаю, мультисеть должна быть лучше. Но тогда, как мне следует использовать мультимножество для одного и того же случая?Нужно ли для этого иметь явную функцию сортировки? –

0

Вам нужен менее (не менее равный) компаратор.

Две клавиши эквивалентны, если:

That is, two keys k1 and k2 are considered to be equivalent if for the comparison object comp, comp(k1, k2) == false && comp(k2, k1) == false.

(От 23.2.4 Ассоциативные контейнеры)

1

Компаратор для ассоциативного контейнера должен вызывать строгий слабый порядок на тип ключа. std::less_equal не является строгим слабым заказом. В частности, он не является строгим, потому что x <= x для некоторых x (фактически, для всех x). Вместо этого вы должны использовать std::less.

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