リバースイテレータは後方に行くために++
を呼び出して、あなたが通常のイテレータのようにそれらを扱うことができますので、あなたが一般的なコードを再利用することができます。例:あなたは--
を使用してprintAll
ための逆バージョンを記述する必要はありませんか
#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
}
注意してください。
ここで、すべての機能を<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
}
、このようなご質問にあるような、非汎用コードについては、それはより多くのですスタイルの問題であり、技術的に健全な議論が少なく、互いを優先させることができます。
明確な説明をありがとう! – theVoid
これは良い答えです。なぜなら、実際には(完全に正しい答えが* No *になる)質問に答えるだけでなく、より基本的な(そしてより良い)質問です。* 'reverse_iterator'のポイントは何ですか? – Walter