Подтвердить что ты не робот

Является ли порядок std:: pair <int, std::string> упорядоченным?

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

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

4b9b3361

Ответ 1

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

Определение в стандарте С++ 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).

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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