-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
1

Вновь о функции swap

15.06.2018, 16:39. Показов 1241. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Все мы знаем, что в стандартной библиотеке полно всяких разных вариантов swap, которые обменивают местами два произвольных элемента самых различных классов и структур.
Хотелось бы узнать, а есть ли в стандартной библиотеке вариант функции swap, при помощи которой можно обменивать местами диапазоны.

Например, вот примерно с таким прототипом

swap(beg1, end1, /*beg2 быть не должно предполагается beg2 == end1 */, end2)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.06.2018, 16:39
Ответы с готовыми решениями:

Написание шаблонной функции swap
Добрый вечер, в качестве упражнения пытаюсь написать собственнную шаблонную функцию swap. Если...

Шаблоны и переопределение функции swap
Есть у меня шаблонный класс, решил для него функцию swap написать: template <typename T> void...

Написание своей функции swap()
Доброго времени суток. Решил написать свою функцию по смене местами переменных переменных. Вот...

Неизвестные функции динамических структур emplace, swap и _Get_container
Здравствуйте, работаю в студии 2017-го года. При работе со списком и стеком я наткнулся на функции...

6
"C with Classes"
1644 / 1401 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
15.06.2018, 16:42 2
Просто Саша, http://ru.cppreference.com/w/cpp/algorithm/swap

Добавлено через 29 секунд
2) Обмен массивов a и b. В действительности вызывает std::swap_ranges(a, a + N, b).
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
15.06.2018, 18:16  [ТС] 3
Цитата Сообщение от _stanislav Посмотреть сообщение
2) Обмен массивов a и b. В действительности вызывает std::swap_ranges(a, a + N, b).
Это не совсем то, что нужно.
А нужно обменивать по месту два смежных диапазона любого контейнера, причем размеры этих диапазонов могут и не совпадать.
0
Вездепух
Эксперт CЭксперт С++
11688 / 6367 / 1723
Регистрация: 18.10.2014
Сообщений: 16,050
15.06.2018, 19:00 4
Цитата Сообщение от Просто Саша Посмотреть сообщение
А нужно обменивать по месту два смежных диапазона любого контейнера, причем размеры этих диапазонов могут и не совпадать.
Тогда это уже не имеет никакого отношения к std::swap.

В терминах обмена значений, это std::rotate. Обмен местами двух смежных диапазонов, возможно разной длины - это просто обыкновенный циклический сдвиг. std::rotate как раз и является эффективной реализацией циклического сдвига.
1
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
15.06.2018, 19:12  [ТС] 5
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Тогда это уже не имеет никакого отношения к std::swap.
Пусть будет так, с поправкой на мою невежественность.
Но значит все таки есть такое.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
15.06.2018, 19:20 6
Цитата Сообщение от Просто Саша Посмотреть сообщение
А нужно обменивать по месту два смежных диапазона любого контейнера, причем размеры этих диапазонов могут и не совпадать.
3 memcpy c дополнительной проверкой размеров и (если размеры частей произвольны) динамическим созданием буфера для временных значений. По схеме c = a; a = b; b = c; где с - буфер. Либо (если размеры хотя бы приблизительно известны) то 3*N вызовов memcpy с фиксированным буфером, которые бы по кусочкам меняли местами данные в диапазонах (где N = (<размер диапазона> + <размер буфера> - 1)/<размер буфера>. Причём в последнем кусочке копировался бы только нужный остаток а не весь буфер.

Добавлено через 1 минуту
И ещё может потребоваться проверка от самокопирования.
0
Вездепух
Эксперт CЭксперт С++
11688 / 6367 / 1723
Регистрация: 18.10.2014
Сообщений: 16,050
15.06.2018, 20:03 7
Цитата Сообщение от TRam_ Посмотреть сообщение
3 memcpy c дополнительной проверкой размеров и (если размеры частей произвольны) динамическим созданием буфера для временных значений. По схеме c = a; a = b; b = c; где с - буфер. Либо (если размеры хотя бы приблизительно известны) то 3*N вызовов memcpy с фиксированным буфером, которые бы по кусочкам меняли местами данные в диапазонах (где N = (<размер диапазона> + <размер буфера> - 1)/<размер буфера>. Причём в последнем кусочке копировался бы только нужный остаток а не весь буфер.
Во-первых, копирование элементов контейнера через memcpy в общем случае невозможно. Во-вторых, как сказано выше, "обменять" надо два соседних диапазона разной длины, что сделать несколько сложнее, чем просто c = a; a = b; b = c;.
0
15.06.2018, 20:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2018, 20:03
Помогаю со студенческими работами здесь

Оптимизация кода функции swap для двусвязного списка
Написал функцию для обмена двух любых элементов двусвязного списка, рассмотрел все случаи, но мне...

Вновь потоки и вновь я не знаю что делать
Привет! Есть 10 потоков, каждый из которых должен отправлять запрос Вот, как отправляю сам...

Касперский вновь и вновь находит вирус
Здравствуйте! Установлен Kaspersky Internet Security 2016. Находит вирус...

Реализация функции swap
Здравствуйте. Как реализовать функцию swap в python? Пишу вот такой код: def swap(list, i,...

Массив. Без функции swap
/** * Заполнить массив из 10 элементов случайными чис-лами в интервале и отсортировать первую...

Обмен двух строк (swap) с использованием функции
Нужно обменять содержимое двух строк. Я так понимаю в main мы создаем две константных строки s1,s2,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru