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()] << " ";
}
}
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;
}
}
}
}
`
a
b
c
a
b
c
让我们假设我有不同的函数来访问单个字符串 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()] << " ";
}
}
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;
}
}
}
}
`
a
b
c
a
b
c