web-dev-qa-db-ja.com

end()を使用したstd :: vectorの最後の要素へのイテレーター-

std::vectorがあり、iteratorをベクターの最後の要素にしたい。このイテレーターを後で使用するために保管します。

注:std::vector::backではなく、それへのイテレータ参照が必要です。後でstd::vector::beginからこのオブジェクトのインデックスを計算できるようにするためです。

以下は、イテレータを最後の要素に到達させるための私のロジックです。

std::vector<int> container;
std::vector<int>::iterator it = container.end()--;

std::vector::endはO(1)時間の複雑さを持っているので、これを行うより良い方法はありますか?

12
Quark

私はあなたがどちらかを意味すると思います:

_std::vector<int>::iterator it = --container.end();
std::vector<int>::iterator it = container.end() - 1;
std::vector<int>::iterator it = std::prev(container.end());
_

意図せずにend()を返すだけです。しかし、これらすべての問題は、ベクターが空の場合に発生します。そうでない場合、それらはすべて一定の時間で正しく動作します。ベクトルが空の場合でも、最後の要素はありません。

イテレータを保存するときも注意してください。イテレータは無効になる可能性があります。

_vector<T>::iterator_が_T*_(これは有効です)だけである場合、上記の最初のフォームの形式が正しくないことに注意してください。 2番目の2つは関係なく機能するので、望ましいです。

25
Barry

post incrementafterが割り当てられるまで値を変更しないため、この方法では誤ったイテレータが提供されます。

これは常にあります:

auto it = std::prev(container.end());

イテレータが有効な範囲に存在するように、コンテナが空でないことを最初に確認することを忘れないでください。

10
Galik

必要なことを行うrbeginがあります

cplusplusリファレンス

auto last = container.rbegin();
8
dau_sama