Является ли порядок std:: pair <int, std::string> упорядоченным?
Кажется, что я могу отсортировать std::vector<std::pair<int, std::string>>
, и он будет сортироваться по значению int. Это хорошо определенная вещь?
Имеет ли std::pair
порядок по умолчанию, основанный на его элементах?
Ответы
Ответ 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
сами по себе сопоставимы.