Помогите, пожалуйста, решить задачу по программированию в с++. Разбить элементы массива на группы по 4. В каждой четверке осуществить сдвиг влево на 1. Первый на 4 место. Если количество элементов в массиве не кратно 4, то для последней группы сдвиг осуществляется для того количества элементов, которое осталось Это нужно сделать без использования всяких навороченных штук, только с помощью циклов и т.д.
Имелся практически готовый код, переделал под Вашу задачу. Если разберетесь, будет хорошо. Можете убрать шаблоны, сделав под свои конкретные типы. Тогда как раз останутся одни функции с циклами.
#include <iostream>
#include <algorithm>
template<typename ForwardIterator>
void rotate(ForwardIterator begin, ForwardIterator first, ForwardIterator end)
{
while (begin != first && first != end) {
ForwardIterator beginCopy = first;
for (; begin != first && beginCopy != end; ++begin, ++beginCopy) {
std::iter_swap(begin, beginCopy);
}
if (begin == first) {
first = beginCopy;
}
}
}
template<typename ForwardIterator>
void shift(ForwardIterator begin, ForwardIterator end, int step)
{
std::ptrdiff_t dist = std::distance(begin, end);
if (step == 0 || dist == 0) {
return;
}
ForwardIterator first = (step < 0? begin: end);
std::advance(first, -step % dist);
//std::rotate(begin, first, end);
::rotate(begin, first, end);
}
template<typename ForwardIterator>
ForwardIterator safe_advance(ForwardIterator begin, ForwardIterator end, int distance)
{
//todo: negative distance
//todo: optimize for random access iterator
ForwardIterator it = begin;
while (it != end && distance) {
++it;
--distance;
}
return it;
}
template<typename ForwardIterator>
void shift_chunks(ForwardIterator begin, ForwardIterator end, unsigned chunk_size, int shift)
{
while (begin != end) {
ForwardIterator chunk_end = safe_advance(begin, end, static_cast<int>(chunk_size));
shift(begin, chunk_end, shift_value);
begin = chunk_end;
}
}
int main()
{
int arr[] = {1, 5, 6, 4, 7, 8, 9, 8, 5, 3};
shift_chunks(arr, arr + sizeof(arr) / sizeof(*arr), 4, -1);
for (auto e: arr) {
std::cout << e << " ";
}
}
http://rextester.com/ZYA1914
Виртуальный выделенный сервер (VDS) становится отличным выбором
Неправильно сравнивает 2 массива, вместо false(-) выдает true(+)В чем проблема? (Функция помечена комментарием)
ЗдравствуйтеНасколько я знаю ОС сама выделяет память под кучу, но как тогда работать с памятью если мы незнаем сколько ее в куче?
Имеется приложение, которое записывает звук и сохраняет его в памяти устройстваПри первом открытии активити, приложение выдало запрос на разрешение...