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

时间:2015-04-25 18:39:52

标签: c++ string loops c++11 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的第一个字符。< / p>

3 个答案:

答案 0 :(得分:3)

如果你真的想使用迭代器而不是索引,你可以使用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

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

尽管如此,对于你想象的工作,似乎还是足够的。

答案 1 :(得分:2)

我只是使用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

答案 2 :(得分:0)

我不知道您需要多少次才能使用它,但在这里(您可以编辑它以满足您的需求):

#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