使用迭代器向后迭代

时间:2016-11-19 09:10:10

标签: c++ string iterator

为简化我的问题,我将使用std::string::iteratorstd::string::reverse_iterator,但问题一般是关于迭代器。

使用以下循环是否有任何特殊原因要向后迭代:

std::string s = "something";
for (std::string::reverse_iterator it = s.rbegin(); it != s.rend(); ++it)

而不是这一个:

std::string s = "something";
std::string::iterator it = in.end();
while(it!=in.begin())
{
    it--;
   //do something
}

2 个答案:

答案 0 :(得分:4)

反向迭代器允许您重用通用代码,因为您可以将它们视为普通迭代器,将++调用为倒退。例如:

#include <iostream>
#include <string>

template <class Iterator>
void printAll(Iterator begin, Iterator end)
{
    for (auto it = begin; it != end; ++it) // ++ can mean "go backwards"
                                           // if Iterator is a reverse
                                           // iterator
    {
        std::cout << *it << "\n";
    }
}

int main()
{
    std::string s = "123";
    printAll(s.begin(), s.end());   // prints 1, 2, 3
    printAll(s.rbegin(), s.rend()); // prints 3, 2, 1
}

请注意您不需要使用printAll--编写反向版本。

现在,考虑<algorithm>中的所有功能。反向迭代器的存在意味着您可以以相反的方式轻松地使用所有这些迭代器。例如,有std::copy_n,但不是std::reverse_copy_n,但是使用反向迭代器,没有必要,因为你可以写这样的东西:

#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>

int main()
{
    std::string input = "abcdef";
    std::string output;
    std::string output_reversed;

    // copy the first 3 elements:
    std::copy_n(input.begin(), 3, std::back_inserter(output));

    // copy the first 3 elements going backwards, starting at the last one:
    std::copy_n(input.rbegin(), 3, std::back_inserter(output_reversed));

    std::cout << output << "\n";          // prints abc
    std::cout << output_reversed << "\n"; // prints fed
}

对于非通用代码,例如在你的问题中,它更像是一个样式问题,几乎没有技术上合理的参数而不喜欢一个。

答案 1 :(得分:1)

因为begin()指向第一个成员,而end()指向最后一个成员,所以关于干净代码(因为在使用非反向迭代器的情况下,你会首先执行迭代器递减,然后是你想要执行的代码,然后你会将iterator与begin()进行比较,但它是错误的,,因为begin()指向现有的第一个元素。

std::vector::end() at cplusplus.com