Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Странное поведение стандартной библиотеки - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Локализация TinyXml http://www.cyberforum.ru/cpp-beginners/thread765170.html
Доброго времени суток! Вопрос следующий. Есть главное меню в котором название кнопок забито в коде. Необходимо пропустить все названия через локализацию. То есть xml в котором хранятся названия...
C++ Найти сумму 1 + 1/2 + 1/3 + ... + 1/N Скоро экзамен , кто чем может ) Помоги ближнему , ибо смех продлевает жизнь...) 11. Дано целое число N (> 0). Найти сумму 1 + 1/2 + 1/3 + ... + 1/N (вещественное число). Или если есть... http://www.cyberforum.ru/cpp-beginners/thread765136.html
Найти значение заданного выражения без использования условного оператора C++
Скоро экзамен , кто чем может ) Помоги ближнему , ибо смех продлевает жизнь...) 12. Дано целое число N (> 0). Найти значение выражения 1. 1 - 1.2 + 1.3 - ... (N слагаемых, знаки чередуются)....
C++ Вывести элементы массива в обратном порядке.
Скоро экзамен , кто чем может ) Помоги ближнему , ибо смех продлевает жизнь...) 13. Дан массив размера N. Вывести его элементы в обратном порядке. Или если есть анологии пришлите...
C++ Найти максимальный элемент массива из его элементов с нечетными номерами http://www.cyberforum.ru/cpp-beginners/thread765131.html
Скоро экзамен , кто чем может ) Помоги ближнему , ибо смех продлевает жизнь...) 15. Дан массив A размера N. Найти максимальный элемент из его элемен¬тов с нечетными номерами: A1, A3, A5, ... ....
C++ Дано двузначное число. Вывести число, полученное при перестановке цифр исходного числа. Скоро экзамен , кто чем может ) Помоги ближнему , ибо смех продлевает жизнь...) 4. Дано двузначное число. Вывести число, полученное при перестанов¬ке цифр исходного числа. Или если есть... подробнее

Показать сообщение отдельно
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501

Странное поведение стандартной библиотеки - C++

18.01.2013, 18:51. Просмотров 564. Ответов 5
Метки (Все метки)

Всем привет.

Обнаружил неправильное, по моему скромному мнению, поведение стандартной библиотеки.
Дело в том, что в СБШ определены операторы сравнения всех контейнеров. Больше, меньше, равно, не равно, и т.д.
Например, для класса "std::set<...>" оператор "меньше" определён следующим образом:
C++
1
2
3
4
5
6
7
8
template <class _Key, class _Compare, class _Allocator>
inline _LIBCPP_INLINE_VISIBILITY
bool
operator< (const set<_Key, _Compare, _Allocator>& __x,
           const set<_Key, _Compare, _Allocator>& __y)
{
    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
}
Как видно, тут используется стандартный алгоритм "std::lexicographical_compare".
Проблема в том, что в алгоритм не передаётся компаратор контейнера, то есть все элементы сравниваются на "меньше". Из-за этого невозможно сравнить два множества, для элементов которых не определён оператор "меньше", поэтому не скомпилируется следующий (абстрактный) пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <set>
 
struct point
{
    double x;
    double y;
};
 
struct point_lies_to_the_left
{
    bool operator () (const point & left, const point & right) const
    {
        return left.x < right.x;
    }
};
 
int main ()
{
    std::set<point, point_lies_to_the_left> s1{{1, 2}, {3, 4}};
    std::set<point, point_lies_to_the_left> s2{{2, 2}};
    
    s1 < s2; // Не работает.
    
    return 0;
}
То есть по логике вещей функция сравнения должна выглядеть так:
C++
1
2
3
4
5
6
7
8
template <class _Key, class _Compare, class _Allocator>
inline _LIBCPP_INLINE_VISIBILITY
bool
operator< (const set<_Key, _Compare, _Allocator>& __x,
           const set<_Key, _Compare, _Allocator>& __y)
{
    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end(), _Compare());
}
Но меня смущает, что, во-первых, такое поведение заложено для всех упорядоченных контейнеров ("сетов", "мапов"), а во-вторых, так сделано в библиотеках обоих компиляторов clang и gcc. То есть это сделано явно намеренно, и на ошибку не похоже.

Может ли кто-нибудь прокомментировать данный факт? Может, я чего-то не понимаю?

Добавлено через 16 часов 1 минуту
Нашёл строчку, сообщающую о таком поведении операторов: http://www.cplusplus.com/reference/set/set/operators/.
Тем не менее, мне непонятно, с чем это связано, и логики в происходящем не вижу.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru