7

双方向データ構造 (実際にはベクトル) 内の位置への通常の反復子があります。ここで、現在の位置から過去の x 要素に対して操作を実行したいと考えています。最後の x がベクトルの最初の要素である可能性がありますが、常に少なくとも x 個の要素が前に存在します。

私はこのコードを書きました

vector<Record>::iterator it = itCurrentRecord;
for (unsigned int i = 0; i < length; i++)
{
    (it--)->length = length;
}

これは安全ですか?最初の要素を指している場合、最後のデクリメントにより、イテレーターが最初の要素の前の 1 つを指すようになるのではないかと心配しています。これは無効です。

もしそうなら、どうすればこれを安全な方法で書き直すことができますか?

ありがとう

4

4 に答える 4

4

あなたの懸念は有効です。これはランダム アクセス イテレータであるため、算術演算を使用して未定義の動作を回避できます。

vector<Record>::iterator it = itCurrentRecord;
for (unsigned int i = 0; i < length; i++)
{
    (it - i)->length = length;
}
于 2013-09-20T15:43:41.163 に答える
0

範囲の先頭から開始itして、前方に繰り返すことができます。

vector<Record>::iterator it = std::prev(itCurrentRecord, length - 1);
for (unsigned int i = 0; i < length; i++)
{
    (it++)->length = length;
}

注:std::prevは C++11 の機能です。

于 2013-09-20T15:51:18.533 に答える
0

すでに述べた解決策に加えて、次のようなことができます。

// assume vector<Record> v is filled;
vector<Record>::iterator it = currentRecord;
for_each(v.begin(), it, [&](Record& r)
{
    r.length = length;
});

または、逆方向に移動する必要がある場合 (たとえば、反復の順序が重要な場合):

for_each(reverse_iterator<vector<Record>::iterator>(it), v.rend(), [&](Record& r)
{
    r.length = length;
});
于 2013-09-20T15:58:48.770 に答える