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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ SDL Графика http://www.cyberforum.ru/cpp-beginners/thread763399.html
Может кто чем поможет? -Написать фильтр преобразования матрицы изображения к бинарному виду. (только белый (255.255.255) или только чёрный (0.0.0)(двойным циклом , передавать число. >127 - становится чёрным, <127 - белым.) -Написать фильтр преобразования к чёрнобелому виду. (Greyscale). Основной код #include <stdio.h> #include <stdlib.h> #include<SDL2/SDL.h> struct Pixel{
C++ Виртуальный замок Доброе утро! Возникла такая проблема. Допустим, я хочу запретить наследоваться от своего класса другим классам и получить ошибку компиляции(но не пряча при этом конструктор и деструктор в приватную секцию, и не используя С++11). Для этого я пишу виртуальный замок (virtual lock) class Lock { friend class Foo; Lock() { } Lock(const Lock&) { } }; http://www.cyberforum.ru/cpp-beginners/thread761293.html
Ваше профессиональное мнение C++
Здравствуйте! Очень нужно ваше профессиональное мнение и опыт, а ещё лучше преподавательский опыт. Хочу основательно подготовиться к экзамену. Экзамен по системному программному обеспечению. Подскажите пожалуйста, что обязательно нужно знать по вот этим темам: 1. Системное программное обеспечение. Классификация. 2. Виртуальные машины: архитектура, достоинства и недостатки. 3. Реализация...
C++ Шифрование и обфускация принимается за вирус?
Дело вот в чем. Есть программа, при проверке которой онлайн антивирус и антивирус на компе утверждают, что скачивание не безопасно. Но сам создатель говорит, что антивирусники тупят, потому что он зашифровал код, а также ссылается на обфускацию. При проверке онлайн выводит infected with BackDoor.XtremeRat.3. Может такое быть или там на самом деле вирус и он просто разводит? Сейчас показывает,...
C++ Выбор языка программирования http://www.cyberforum.ru/cpp-beginners/thread750492.html
Здравствуйте! Вопрос не в тему. Просто не знал в какой раздел написать. Необходимо создать программу для создания и расчета смет. Подскажите пожалуйста какой язык программирования более всего подходит для реализации программ данного типа?
C++ Тема для магистерской работы Всем привет. Можете помочь выбрать тему для магистерской работы. Если можно что нибуть связанное с C++. Заранее спасибо. подробнее

Показать сообщение отдельно
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
18.01.2013, 18:51     Странное поведение стандартной библиотеки
Всем привет.

Обнаружил неправильное, по моему скромному мнению, поведение стандартной библиотеки.
Дело в том, что в СБШ определены операторы сравнения всех контейнеров. Больше, меньше, равно, не равно, и т.д.
Например, для класса "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/.
Тем не менее, мне непонятно, с чем это связано, и логики в происходящем не вижу.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 21:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru