C ++:遍历字符串 - 迭代器?

C++: looping over a string - iterator?

让我们假设我有不同的函数来访问单个字符串 str(获取其中的单个字符)并且我想在每次访问时循环遍历该字符串...我该如何实现?

例如:

string str = "abc";
function1(); // returns "a"
function2(); // returns "b"
function3(); // returns "c"
function4(); // returns "a" again
function2(); // returns "b" again
...

所以基本上我有不同的函数来访问这个字符串 str 我需要某种迭代器,如果到达 str 的末尾,它会返回到 str 的第一个字符.

我只想使用 % 模数运算符从 string 中索引出来。这将为您提供所需的环绕行为。

#include <iostream>
#include <string>

int main()
{
    std::string str = "abc";
    for (int i = 0; i < 10; ++i)
    {
        std::cout << str[i % str.size()] << " ";
    }
}

Output

a b c a b c a b c a

如果你真的想使用迭代器而不是索引,你可以使用 cyclic_iterator,像这样:

#ifndef CYCLIC_ITERATOR_H_INC_
#define CYCLIC_ITERATOR_H_INC_
#include <iterator>

template <class FwdIt>
class cyclic_iterator_t : public std::iterator<std::input_iterator_tag, typename FwdIt::value_type> {
    FwdIt begin;
    FwdIt end;
    FwdIt current;
public:
    cyclic_iterator_t(FwdIt begin, FwdIt end) : begin(begin), end(end), current(begin) {}

    cyclic_iterator_t operator++() { 
        if (++current == end) 
            current = begin; 
        return *this; 
    }
    typename FwdIt::value_type operator *() const { return *current; }
};

template <class Container>
cyclic_iterator_t<typename Container::iterator> cyclic_iterator(Container &c) { 
    return cyclic_iterator_t<typename Container::iterator>(c.begin(), c.end());
}

#endif

这对于迭代器来说是非常小的——例如,它目前只支持预增量,而不是 post-增量(而且它是一个前向迭代器,所以你可以用迭代器做的就是增加它并取消引用它)。

尽管如此,对于您设想的工作来说,这似乎已经足够了。

我不知道你需要多少次它才能工作,但你在这里(你可以编辑它以满足你的需要):

#include <iostream>
#include <string>

int main()
{
   std::string str = "abc";

    bool bAgain = true;

    int Max = str.length() + 1;

    for(int i = 0; i < Max; i++)
    {
        std::cout << str[i] << "\n";

        if(bAgain)
        {
            if(i == Max - 1)
            {
                i = -1;
                bAgain = false;
                continue;
            }
        }
    }
}

`

Output

 a 
 b 
 c 
 a 
 b 
 c