Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何遍历双链表(环)的每一个第二个元素?_C++_Iterator_Doubly Linked List - Fatal编程技术网

C++ 如何遍历双链表(环)的每一个第二个元素?

C++ 如何遍历双链表(环)的每一个第二个元素?,c++,iterator,doubly-linked-list,C++,Iterator,Doubly Linked List,环形线性数据结构,其中结束点指向结构的开始。它也称为循环缓冲区、循环队列或循环缓冲区 我有一个函数要写。它的目的是从原始环生成另一个环结构,但它的长度已定义,而且它必须是原始环的每一个第二个元素 例如: 原始环=1,2,3,4,5 调用函数newRing:newRing(originalRing,nRing,len1=5) nRing=1,3,5,2,4 (说明:'1'是环的第一个元素。每秒意味着我取3,5…但这是环,所以它像1,2,3,4,5,1,2,3,4,5,…函数说nRing的长度必须是

环形线性数据结构,其中结束点指向结构的开始。它也称为循环缓冲区、循环队列或循环缓冲区

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

例如:

原始环=1,2,3,4,5

调用函数newRing:newRing(originalRing,nRing,len1=5)

nRing=1,3,5,2,4

(说明:'1'是环的第一个元素。每秒意味着我取3,5…但这是环,所以它像1,2,3,4,5,1,2,3,4,5,…函数说nRing的长度必须是5,所以我取下一个元素:2,4。最后它给出1,3,5,2,4)

我正在使用迭代器(我必须,学校项目)

迭代器i1=nRing.begin();//--。begin()指向环的“开始”
if(originalRing.isEmpty()){/---originalRing是否为空
返回false;}
如果(originalRing.length()==1){/--如果元素的originalRing编号为1,则返回该环
返回原始环;
}

if(len1您可以使用
std::stable_partition
来执行此操作。它将分割环形缓冲区中的元素,以便lambda返回true的元素位于lambda返回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";
    }
}

要做的事情是将其放入循环:

i1++


i1++

什么是环?请提供一个。不知道你所说的“环”是什么意思,
i%ring.length()
将始终为你提供环内正确的索引,而不管
i
的值和循环的长度。因此,也许你应该记住这一点来编写循环。我刚刚写了环是什么。你是怎么得到的[1,3,5,2,4]来自[1,2,3,4,5]?现在我明白了,这是一个循环队列。如果你知道如何增加一次,你也可以增加两次:
++(++)it
#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