3

std::string::iterator与えられた位置に安全に探すことは可能ですか?

std :: string :: iteratorにはオフセットアクセス演算子(演算子[])がありますが、のような未定義の動作として一部の人によって定義されたカテゴリに存在しますit + 3

cplusplus.comリファレンス

4

3 に答える 3

4

std :: string :: iteratorにはオフセットアクセス演算子(演算子[])がありますが、+ 3のように、未定義の動作として一部の人によって定義されたカテゴリに存在します。

私はこの声明を理解していません。そのようなカテゴリーはありません。std::basic_string<>::iteratorはランダムアクセスイテレータであるため、オフセットを加算または減算するだけでシークできます(これはリンク先のドキュメントと一致しています)。

auto new_it = it + offset;

未定義とはend()、関連するコンテナのイテレータを超えて、またはその開始前にシークすることです。つまり、以下は未定義の動作です。

std::string str = "hi";
auto it1 = str.begin() + 2; // OK.
assert(it1 == str.end());
auto it2 = str.begin() + 3; // UB!
// At this point we cannot assert anything about it2
于 2012-12-20T11:35:12.020 に答える
2

operator[]UBforというアイデアをどこで得たのかわかりませんstd::string::iterator。これは、とをサポートするランダムアクセスイテレータとして定義されていi[n]ますi + n

他の場所でのコメントに基づくと、あなたは絶対的なポジショニングを求めているようです(それはあなたの質問の言い回しからはあまり明確ではありません)。位置がわからないイテレータからはそれを行うことはできませんが、によって返されるイテレータに対してオフセットすることで同じ効果を得ることができます。begin()つまり、:str.begin()[3]またはstr.begin() + 3。元の弦が手元にない場合は、うんざりしています。

于 2012-12-20T11:33:19.967 に答える
1

標準のイテレータは、イテレータが繰り返すコンテナ(または他のシーケンス)を参照する必要がないように指定されています。これは、イテレータだけを使用して「絶対シーク」を実行する方法がないことを意味します。文字列から新しいイテレータを取得し、範囲内にあることを確認する必要があります。何かのようなもの:

std::string::iterator seek(std::string & s, size_t i) {
    return s.length() <= i ? s.end() : s.begin() + i;
}

ランダムアクセスイテレータおよびoperator[]文字列の算術演算は、範囲内にある限り明確に定義されています。範囲外に出た場合にのみ、動作は未定義になります。

于 2012-12-20T11:33:57.327 に答える