2016-11-19 4 views
2

私の質問の簡略化のために、私はstd::string::iteratorstd::string::reverse_iteratorを使用しますが、一般的に反復子に関する質問です。イテレータを使用して後方に反復する

次ループ用い後方反復する任意の特定の理由がある:()最初のメンバーを指し、およびエンド()を始めるため

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

答えて

4

リバースイテレータは後方に行くために++を呼び出して、あなたが通常のイテレータのようにそれらを扱うことができますので、あなたが一般的なコードを再利用することができます。例:あなたは--を使用して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 
} 

、このようなご質問にあるような、非汎用コードについては、それはより多くのですスタイルの問題であり、技術的に健全な議論が少なく、互いを優先させることができます。

+0

明確な説明をありがとう! – theVoid

+1

これは良い答えです。なぜなら、実際には(完全に正しい答えが* No *になる)質問に答えるだけでなく、より基本的な(そしてより良い)質問です。* 'reverse_iterator'のポイントは何ですか? – Walter

1

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

なく、この1つは最後のメンバーの隣にあるメンバを指しています。つまり、リバースイテレータを使用しない場合は、イテレータのデクリメントを行い、次に実行するコードはです。イテレータとbegin()を比較します。それは間違っている、はbegin()が既存の最初の要素を指しているためです。

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

+2

'in.begin() - 1'いいえ、いいえ、いいえ、1000回もありません。 –

+0

私はそれをお勧めしませんでしたが、ときどきうまくいく可能性があります。 – sandyre

+0

@sandyre私はwhileループが私がそれをテストしてから期待されることをすると信じています。 – theVoid

関連する問題