Как перебрать каждый ВТОРОЙ элемент двусвязного списка (кольца)? - PullRequest
0 голосов
/ 14 мая 2019

RING - линейная структура данных, в которой конец указывает на начало структуры. Он также называется циклическим буфером, циклической очередью или циклическим буфером.

У меня есть функция для записи. Его целью является создание другой структуры RING из исходного RING, но она имеет определенную длину, и дело в том, что это должен быть каждый ВТОРОЙ элемент исходного RING.

Пример:

originalRing = 1,2,3,4,5

вызывается функция newRing: newRing (originalRing, nRing, len1 = 5)

nRing = 1,3,5,2,4

(пояснение: «1» - 1-й элемент КОЛЬЦА. Каждая секунда означает, что я беру 3, 5 ... но это КОЛЬЦО, так что это выглядит как 1,2,3,4,5,1,2 , 3,4,5, ... Функция говорит, что nRing должен иметь длину 5, поэтому я беру следующий каждый элемент: 2,4. Наконец, он дает 1,3,5,2,4)

Я использую итераторы (я должен, школьный проект).

iterator i1 = nRing.begin(); //--- .begin() points to the 'beginning' of the Ring
if (originalRing.isEmpty()){ //---whether originalRing is empty or not
  return false;}

if (originalRing.length()==1){ //--- if originalRing no. of elements is 1, returns that Ring
  return originalRing;
}
if (len1<=0) //--- doesnt make sense
{return false;}

if(!i1.isNULL()) //--- checks whether iterator is null
    {
        for(int i = 0; i < len1; i++)
        {
            nRing.insertLast(i1.getKey()); //insert the element to the end of the Ring
            i1++;

        }
    }

Итак, здесь я спрашиваю, что i1 ++ --- итерирует элементы один за другим.

Мой вопрос заключается в том, как определить цикл с итератором, определенным для присоединения каждого второго элемента?

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Что нужно сделать, это поместить в цикл:

i1 ++;

i1 ++

0 голосов
/ 14 мая 2019

Вы можете использовать std::stable_partition для этого.Он разделит элементы в вашем кольцевом буфере так, что те, для которых лямбда возвращает true, предшествуют тем элементам, для которых он возвращает false.Вы можете создать лямбду с изменяемым состоянием / изменяемой лямбда для переключения true / false для каждой итерации.

#include <iostream>
#include <vector>    // std::vector
#include <algorithm> // std::stable_partition

int main() {
    std::vector<int> RING = {1, 2, 3, 4, 5};
    for(const auto& v : RING) std::cout << v << " ";
    std::cout << "\n";

    for(int i = 0; i < 4; ++i) {

        std::stable_partition( RING.begin(), RING.end(),
            [toggle = false](const auto&) mutable {
                return toggle ^= true; // false becomes true and vice-a-versa
            }
        );

        for(const auto& v : RING) std::cout << v << " ";
        std::cout << "\n";
    }
}

Вывод:

1 2 3 4 5
1 3 5 2 4
1 5 4 3 2
1 4 2 5 3
1 2 3 4 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...