2011-12-16 6 views
2

std::stringの特定の文字に対するイテレータが最初からループせずに必要です。std :: string内の特定の文字へのイテレータ

これを行う最も良い方法ですか?

std::string s("abcdefg..."); 
size_t id = 5; 
std::string::const_iterator it = s.begin(); 
std::advance(it, id - 1); 

答えて

3

あなたは、単に行うことができます。

std::string::const_iterator it = s.begin() + (id-1); 

itは、ランダムアクセスイテレータであれば、それは、以来、std::advanceの多かれ少なかれ同じ性能を持っているべきであるが、advanceoperator+を使用しています(それ以外の場合は頼っこれは例えばlistイテレータの場合に起こります)。イテレータがランダムアクセスである

+0

私がのstd ::文字列の割り当て忘れてしまいました連続している... Grazie! –

+2

@PietroM: 'string'割り当てが連続しているかどうかは関係ありません。iterator型と関係があります。 'deque'は連続した割り当てはありませんが、ランダムアクセスイテレータを持っているので、イテレータは' operator + 'を持っています。 –

+1

@PietroM:prego、ma effettivamenteはdice Steve Jessopと一緒に来ました。 :)文字列が連続したメモリ割り当てを保証するという事実は、ポインタを使って文字列の中を移動することを可能にします(たとえば、 '&(s [0])'で取得します)。 –

4

std::stringので、あなたはこれを直接行うことができます。

std::string::const_iterator it = s.begin() + (id-1); 

(これは最終的には、ランダムアクセスイテレータのために展開するものstd::advanceです。)

関連する問題