# Cyclic Iterator for K variable length vectors

Given K vectors, the task is to design a cyclic iterator that prints the elements of these vectors in a cyclic manner. For example: v1 = {1, 2, 3}, v2 = {4, 5, 6} and v3 = {7, 8, 9} then the output should be 1, 4, 7, 2, 5, 8, 3, 6 and 9.

Examples:

Input: v1 = {1, 2}, v2 = {3, 4, 5}, v3 = {6}
Output: 1 3 6 2 4 5

Input: v1 = {1, 2}, v2 = {3, 4}
Output: 1 3 2 4

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: Create two arrays, one will store the begin iterators of each vector and other will store the end iterators of each vector. Then print the contents of vectors in a cyclic manner. Since the vectors can be of variable lengths, so skip the vectors all of whose elements have already been printed.

Below is the implementation of the above approach:

 `// C++ implementation of the approach ` `#include ` `using` `namespace` `std; ` ` `  `// Class for the cyclic iterator ` `class` `Iterator { ` `public``: ` `    ``Iterator(vector<``int``>& a1, vector<``int``>& a2, ` `             ``vector<``int``>& a3, vector<``int``>& a4, ``int` `k); ` `    ``int` `numOfVectors; ` `    ``int` `currIndex; ` ` `  `    ``// Vectors to store the starting and the ` `    ``// ending iterators for each of the vector ` `    ``vector::iterator> iStart; ` `    ``vector::iterator> iEnd; ` ` `  `    ``// Function that returns true if ` `    ``// there are elements left to print ` `    ``bool` `hasNext(); ` ` `  `    ``// Function that returns the next ` `    ``// element in a cyclic manner ` `    ``int` `next(); ` `}; ` ` `  `// Function that returns true if ` `// there are elements left to print ` `bool` `Iterator::hasNext() ` `{ ` ` `  `    ``// If iterator of any vector has not ` `    ``// reached the end then return true ` `    ``for` `(``int` `i = 0; i < numOfVectors; i++) { ` `        ``if` `(iStart[i] != iEnd[i]) ` `            ``return` `true``; ` `    ``} ` `    ``return` `false``; ` `} ` ` `  `// Function that returns the next ` `// element in a cyclic manner ` `int` `Iterator::next() ` `{ ` `    ``int` `elem = 0; ` `    ``if` `(iStart[currIndex] != iEnd[currIndex]) { ` `        ``elem = *iStart[currIndex]++; ` `        ``currIndex = (currIndex + 1) % numOfVectors; ` `        ``return` `elem; ` `    ``} ` `    ``else` `{ ` `        ``currIndex = (currIndex + 1) % numOfVectors; ` `        ``return` `next(); ` `    ``} ` `    ``return` `elem; ` `} ` ` `  `// Initialise object of the Iterator class ` `Iterator::Iterator(vector<``int``>& a1, vector<``int``>& a2, ` `                   ``vector<``int``>& a3, vector<``int``>& a4, ``int` `k) ` `{ ` `    ``numOfVectors = k; ` `    ``iStart.resize(numOfVectors); ` `    ``iEnd.resize(numOfVectors); ` ` `  `    ``// Store begin iterators ` `    ``iStart = a1.begin(); ` `    ``iStart = a2.begin(); ` `    ``iStart = a3.begin(); ` `    ``iStart = a4.begin(); ` ` `  `    ``// Store ending iterators ` `    ``iEnd = a1.end(); ` `    ``iEnd = a2.end(); ` `    ``iEnd = a3.end(); ` `    ``iEnd = a4.end(); ` ` `  `    ``// CurrIndex denotes the vector's index ` `    ``// whose element is to be printed next ` `    ``currIndex = 0; ` `} ` ` `  `// Function to print the elements in a cyclic manner ` `void` `iterateCyclic(vector<``int``>& a1, vector<``int``>& a2, ` `                   ``vector<``int``>& a3, vector<``int``>& a4, ``int` `k) ` `{ ` ` `  `    ``// Initialise the iterator ` `    ``Iterator it(a1, a2, a3, a4, k); ` ` `  `    ``// Print all the element ` `    ``// in a cyclic fashion ` `    ``while` `(it.hasNext()) { ` `        ``cout << it.next() << ``" "``; ` `    ``} ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` `    ``// Initialize the vectors ` `    ``vector<``int``> a1; ` `    ``a1.push_back(1); ` `    ``a1.push_back(2); ` `    ``a1.push_back(3); ` ` `  `    ``vector<``int``> a2; ` `    ``a2.push_back(4); ` `    ``a2.push_back(5); ` `    ``a2.push_back(6); ` `    ``a2.push_back(7); ` ` `  `    ``vector<``int``> a3; ` `    ``a3.push_back(8); ` `    ``a3.push_back(9); ` ` `  `    ``vector<``int``> a4; ` `    ``a4.push_back(10); ` `    ``a4.push_back(11); ` ` `  `    ``// Print the elements in a cyclic fashion ` `    ``iterateCyclic(a1, a2, a3, a4, 4); ` ` `  `    ``return` `0; ` `} `

Output:

```1 4 8 10 2 5 9 11 3 6 7
```

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.