std::string
の特定の文字に対するイテレータが最初からループせずに必要です。std :: string内の特定の文字へのイテレータ
これを行う最も良い方法ですか?
std::string s("abcdefg...");
size_t id = 5;
std::string::const_iterator it = s.begin();
std::advance(it, id - 1);
std::string
の特定の文字に対するイテレータが最初からループせずに必要です。std :: string内の特定の文字へのイテレータ
これを行う最も良い方法ですか?
std::string s("abcdefg...");
size_t id = 5;
std::string::const_iterator it = s.begin();
std::advance(it, id - 1);
あなたは、単に行うことができます。
std::string::const_iterator it = s.begin() + (id-1);
it
は、ランダムアクセスイテレータであれば、それは、以来、std::advance
の多かれ少なかれ同じ性能を持っているべきであるが、advance
はoperator+
を使用しています(それ以外の場合は頼っこれは例えばlist
イテレータの場合に起こります)。イテレータがランダムアクセスである
std::string
ので、あなたはこれを直接行うことができます。
std::string::const_iterator it = s.begin() + (id-1);
(これは最終的には、ランダムアクセスイテレータのために展開するものstd::advance
です。)
私がのstd ::文字列の割り当て忘れてしまいました連続している... Grazie! –
@PietroM: 'string'割り当てが連続しているかどうかは関係ありません。iterator型と関係があります。 'deque'は連続した割り当てはありませんが、ランダムアクセスイテレータを持っているので、イテレータは' operator + 'を持っています。 –
@PietroM:prego、ma effettivamenteはdice Steve Jessopと一緒に来ました。 :)文字列が連続したメモリ割り当てを保証するという事実は、ポインタを使って文字列の中を移動することを可能にします(たとえば、 '&(s [0])'で取得します)。 –