Правильно ли упорядочен порядок std :: pair <int, std :: string>? - PullRequest
34 голосов
/ 12 мая 2010

Кажется, что я могу отсортировать std::vector<std::pair<int, std::string>>, и он будет сортироваться по значению int. Это хорошо определенная вещь?

Имеет ли std::pair порядок по умолчанию на основе его элементов?

Ответы [ 4 ]

52 голосов
/ 12 мая 2010

std::pair использует лексикографическое сравнение: оно будет сравниваться на основе первого элемента. Если значения первых элементов равны, он будет сравниваться на основе второго элемента.

Определение в стандарте C ++ 03 (раздел 20.2.2):

template <class T1, class T2>
bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y);

Returns: x.first < y.first || (!(y.first < x.first) && x.second < y.second).
9 голосов
/ 12 мая 2010

Согласно моей копии стандарта C ++ 0x, раздел 20.3.3.26, std::pair имеет operator<, определенный таким образом, что для двух пар x и y он возвращает

x.first < y.first || (!(y.first < x.first) && x.second < y.second)

IЯ не уверен, является ли это частью стандарта 2003 года.Я также должен отметить, что это не скомпилируется, если сами элементы не являются LessThanComparable.

2 голосов
/ 12 мая 2010

Да. operator<() определено для std::pair<T1, T2>, предполагая, что и T1, и T2 сами сопоставимы.

2 голосов
/ 12 мая 2010

Документация от SGI

Оператор сравнения. Используется лексикографическое сравнение: возвращаемое значение равно true, если первый элемент x меньше первого элемента y, и false, если первый элемент y меньше первого элемента x. Если ни один из этих случаев не имеет места, то оператор <возвращает результат сравнения вторых элементов x и y. Этот оператор может использоваться, только если T1 и T2 являются LessThanComparable. Это глобальная функция, а не функция-член. </p>

Похоже, на самом деле это комбинация обоих элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...