如何遍历双向链表(环)的每个SECOND元素?

时间:2019-05-14 15:55:35

标签: c++ iterator doubly-linked-list

RING-线性数据结构,其中端点指向结构的开头。也称为循环缓冲区,循环队列或循环缓冲区。

我有一个要编写的函数。目的是从原始RING生成另一个RING结构,但是它的长度已定义,而且必须是原始RING的每个SECOND元素。

示例:

originalRing = 1,2,3,4,5

函数newRing称为:newRing(originalRing,nRing,len1 = 5)

nRing = 1,3,5,2,4

(解释:“ 1”是RING的第一个元素。每秒表示我取3,5 ...但这是RING,所以它像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 :(得分:0)

您可以使用std::stable_partition来执行此操作。它将对环形缓冲区中的元素进行划分,以使lambda返回true的元素位于返回false的元素之前。您可以创建一个有状态/可变的lambda来为每次迭代切换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

答案 1 :(得分:0)

要做的是进入循环:

i1 ++;

i1 ++