2013-03-04 3 views
2

Я знаю, что в std::map у нас есть ключ и соответствующее отображаемое значение.Является std :: map <std :: set <long>, double> AND std: map <std :: pair <long, long>, double> допустимый тип данных в C++?

Теперь в типе данных, который я упомянул, ключ будет иметь тип std::set<long> или std::pair<long, long>. Таким образом, это верно, учитывая, что в значениях карты хранятся на базах по отсортированному значению ключей. Итак, есть std::map<std::set<long>, double> И std:map< std::pair<long, long>, double> действительно?

+3

Возможно, мне не хватает моей дозы кофеина, и мой мозг вышел из строя, но в вашем объявлении 'std :: map ', std :: set - это шаблон, а не тип. Вам нужно написать что-то вроде 'std :: map , double>', чтобы иметь тип. – paercebal

+0

Да, я имел в виду только это. Но моя лень думала, что эта часть сама подразумевается! – user1599964

+1

Видимо, Андре соглашается со мной, и я подозреваю, что ваш компилятор тоже ... Лязкость - это добродетель, но не злоупотребляйте ею ... ;-) – paercebal

ответ

6

std::set имеет operator<, который выполняет лексикографическое сравнение между двумя наборами одного и того же типа. Так что да, std::set<T> может быть действительным ключом для карты.

An std::pair<T1,T2> также имеет operator< реализации лексикографическое сравнение, поэтому std::map<std::pair<T1, T2>, T3> также будет действительным тогда и только тогда как T1 и T2 имеют менее чем сравнение operator< реализующий строгий слабый порядок. Поэтому требования более жесткие. Оба значения T1 и T2 нуждаются в сравнении, чтобы быть ключами карты, но они не нужны, чтобы сформировать действительную пару. Таким образом, действительная пара не обязательно образует действительный ключ для карты. С другой стороны, вы можете создать экземпляр карты с помощью своих критериев сравнения.

std::map<std::pair<T1, T2>, T3, Comp> m; 
4

Нет, синтаксис неправильный. То, что вы хотите, это std::map<std::set<a_type_here>, double>, поэтому добавьте параметр шаблона для набора.

Примечание a_type_here должны иметь operator< или вам нужно использовать std::set<a_type_here, compare_function>

То, что вы, кажется, хотят это:std::map<std::pair<long, long>, double> mapping

Пример того, как использовать;mapping[std::make_pair(1,2)] = 0.1;

+0

Если у типа не было 'operator <', то 'set ' даже не компилировался, поэтому вопрос был бы спорным. – juanchopanza

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