С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
#1

Ошибка в стандартной библиотеке шланга? - C++

18.06.2013, 01:01. Просмотров 938. Ответов 8
Метки нет (Все метки)

Обнаружил интересную вещь: std::sort из стандартной библиотеки компилятора clang сортирует неправильно.
Код, на котором это происходит, прилагается:

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
26
27
28
29
30
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
 
void print_vector (const std::vector<int> & vector)
{
    for (int x: vector)
    {
        std::cout << x << ' ';
    }
    std::cout << std::endl;
}
 
int main ()
{
    std::vector<int> v(31);
    std::iota(v.begin(), v.end(), 0);
    print_vector(v);
 
    auto compare = std::less_equal<int>();
 
    std::sort(v.begin(), v.end(), compare);
    print_vector(v);
 
    std::cout << (std::is_sorted(v.begin(), v.end(), compare) ? "sorted" : "unsorted")
              << std::endl;
 
    return 0;
}
Проверял на следующих компиляторах:
Код
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin11.4.0
Thread model: posix
Код
clang version 3.2 (tags/RELEASE_32/final)
Target: x86_64-apple-darwin11.4.0
Thread model: posix
При этом в ГЦЦ всё сортируется правильно.

Вопрос:
Это я что-то делаю не так, или у всех такое?
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2013, 01:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в стандартной библиотеке шланга? (C++):

Есть ли критическая секция в стандартной библиотеке? - C++
Здравствуйте! Собственно, сам вопрос. Как использовать критическую секцию в C++? Нашёл информацию о подобном для windows и linux. Есть...

Ошибка в определении стандартной API функции - C++
Переписываю Бота по уроку из Ютьюба. Сейчас первый тест бота. Суть - найти в окне приложения определенный цвет пикселя и поместить туда...

Ошибка в библиотеке std o_O - C++
\program files\visual studio 2008\vc\include\string(14) : error C2143: синтаксическая ошибка: отсутствие &quot;;&quot; перед &quot;namespace&quot; С чем...

литература стандартной библиотеки C++ - C++
Вопрос - какую именно скачать книгу для изучения всех библиотек и их метадов. Ну может самых важных, нужных. Искал, интернет выдаёт...

Подключение стандартной библиотеки с++ - C++
При подключении библиотеки &lt;QProcess&gt; следующая ошибка. Помогите ламеру :wall:

Контейнер стандартной библиотеки - C++
Привет народ ! Вот хотел узнать библиотеки в этой проге :#include &lt;iostream&gt; // для использования std::cout #include &lt;vector&gt; // для...

8
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
18.06.2013, 11:52 #2
volovzi, Плюсую.

Bash
1
2
3
4
./new
0 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 26 27 28 29 30 
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 
unsorted
Используется libc++3.2
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
18.06.2013, 12:01  [ТС] #3
Ужос-ужос. Надо заводить баг.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
20.06.2013, 16:25 #4
volovzi, Почитывал хабр - статья на тему вариадиков, в комментах http://habrahabr.ru/post/183830/ цитируют эту тему. И судя по всему это не является багом.
1
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
20.06.2013, 16:48  [ТС] #5
Заглянул в стандарт — действительно, требуется отношение строгого порядка.
Я считаю, что это недоработка.
Я бы сформулировал требование к алгоритму так:
В результате работы алгоритма для любых двух итераторов i, j из сортируемого диапазона таких, что i < j, должно выполняться соотношение compare(*i, *j) == true.

В противном случае это не сортировка, а какая-то непонятная шняга.
0
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
21.06.2013, 18:37 #6
А ведь элементы-то в массиве все разные. Для них операция <= ничем не отличается от <.
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
21.06.2013, 18:48  [ТС] #7
@Nick Alte, кстати да, хорошее замечание.
Действительно, логично было бы предположить, что для данного случая все сравнения элементов дадут один и тот же результат и для "<", и для "≤".

Хм.
0
Dmitriy_M
1363 / 1246 / 114
Регистрация: 20.03.2009
Сообщений: 4,462
Записей в блоге: 11
21.06.2013, 23:57 #8
В чем смысл сортировать упорядоченный массив?
Как показал отладочный вывод @ForEveR, массив упорядочен, а проблема в
C++
1
2
std::cout << (std::is_sorted(v.begin(), v.end(), compare) ? "sorted" : "unsorted")
              << std::endl;
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
22.06.2013, 00:03  [ТС] #9
@Dmitriy_M, во-первых, этот пример — для краткости кода. Если элементы в массиве изначально будут в обратном порядке, то результат будет тот же. Во-вторых, каким бы ни был изначальный массив, после сортировки он должен быть упорядочен. В-третьих, прочитай, пожалуйста, внимательно отладочный вывод. Там ... 14 16 15 ...
1
22.06.2013, 00:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2013, 00:03
Привет! Вот еще темы с ответами:

Чтение стандартной матрицы - C++
Люди, помогите пожалуйста реализовать....мой замысел состоит в том, что в начале программы выдается вопрос : желаете ли вы решить...

Насчет стандартной функции time() - C++
Есть маленький вопрос, ответ на который не получается найти: Как вывести на экран текущее значение времени с помощью функции тайм, чтобы...

Проблемы со стандартной библиотекой iostream - C++
На домашнем компьютере, в среде разработки Dev C++, при попытке запустить .exe-файл скомпилированной программы выдает ошибку с текстом:...

C++11 новые классы стандартной библиотеки - C++
Здравствуйте. Программирую в eclipse на С++, использую С++11. Код в новом стандарте компилируется, однако мне нужен новый класс...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.