Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2012, 15:39   #1
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию stl inplace_merge

Добрый день всем.

Читаю описание функции inplace_merge:
http://www.cplusplus.com/reference/a...inplace_merge/

И не могу понять её смысла. Можете объяснить на пальцах что и для чего она делает? А лучше пример использования привести, так как тот что на сайте меня только сбивает с толку - для чего так делать?
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...

Последний раз редактировалось sVasilich; 22.05.2012 в 15:44.
sVasilich вне форума Ответить с цитированием
Старый 22.05.2012, 15:47   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

там же написан пример...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.05.2012, 15:52   #3
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Ну и что происходит в том примере? Сортируем 2 массива, копируем их в один вектор и применяем к этому вектору inplace_merge(). На выходе получается один отсортированный массив... Не понимаю для чего это делалось. Ведь тоже самое получили бы, если бы к полученному вектору sort() применили...
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 22.05.2012, 16:03   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

эта сортировка для сортированных массивов после обьединения как я понимаю.
поидее быстрее чем сортировка с нуля.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.05.2012, 16:15   #5
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Спасибо, похоже что так и есть.

Чтобы уже до конца разобраться, ещё вопрос.

Из описания функции
Цитата:
Complexity
Linear in comparisons (N-1) if an internal buffer was used, NlogN otherwise (where N is the number elements in the range [first,last)).
Не понимаю что значит "если был использован внутренний буфер" (internal buffer was used)". В других случаях, так понимаю, сложность сравнима с sort(): N*logN.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 22.05.2012, 17:34   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2sVasilich
inplace_merge производит слияние 2-х отсортированных последовательностей. разница между merge и inplace_merge в том, что merge помещает результат слияния в новый контейнер, который не перекрывается с исходными.
inplace_merge же выполняет слияние 2-х диапазонов (которые лежат в одном контейнере), заменяя их отсортированной последовательностью.
Пример.
у тебя есть контейнер с содержимым
5 6 7 1 3 6 8 9
ты хочешь получить сортированный контейнер. т.к ты знаешь, что в этом контейнере у тебя содержатся 2 отсортированные последовательности
5 6 7
и
1 3 6 8 9
то вместо sort можешь использовать inplace_merge.
почему не использовать всегда sort? потому что временная сложность у inplace_merge - линейная. логарифмичной она становится тогда, когда нет доступной памяти, и как я понимаю, тут и вызывается тот же sort, либо его обобщенный аналог.

вывод? если нужно получить отсортированный контейнер из сортированных последовательностей, лучше вызывать inplace_merge. в лучшем случае это будет произведено за линейное время.


ПС. посмотрел реализацию inplace_merge в VC++, действительно выделяется буфер, равный длине максимальной последовательности.
Цитата:
Не понимаю что значит "если был использован внутренний буфер"
читай, как "если удалось выделить память, если отработал оператор new".

а насчет sort-а ошибся, в случае нехватки буфера там вызываются upper и lower_bound, которые и дают логарифмическую сложность
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 22.05.2012 в 17:55.
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
STL в QT конфликтует с STL в Borland nvrrus C++ Builder 0 31.03.2011 10:51
STL valdemar593 Общие вопросы C/C++ 2 14.02.2011 16:59
STL Crasty Общие вопросы C/C++ 2 18.12.2009 15:50
STL Cpluser Общие вопросы C/C++ 2 22.02.2009 23:35
[C++]STL Mumriksnus Общие вопросы C/C++ 1 02.07.2008 20:43