2016-05-04 11 views
4

私はstd::vectorを持っていて、ベクトルの最後の要素にiteratorを入れたいと思います。このイテレーターを後で使用するために保管します。end()を使ってstd :: vectorの最後の要素に反復する::

注:イテレータのリファレンスはstd::vector::backではありません。私は後でstd::vector::beginからこのオブジェクトのインデックスを計算できるようにしたいからです。

次が最後の要素へのイテレータを得るために、私のロジックです:

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

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

編集:ポストインクリメントは以下のとおり指摘されています。

+1

私は間違ったことはありません。だから何が問題なの? – DeiDei

+3

'container.end() - 'の代わりに '--container.end()'が必要です。また、最初にコンテナが空でないことを確認するか、未定義の動作をする必要があります。 –

+0

aha、私は 'std :: vectorを参照しています。:: :: iterator it = container.end() - ' 'end'イテレータを取得し、イテレータをデクリメントします。 – Quark

答えて

12

私はあなたがいずれかの意味を考える:

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つは関係なく動作するので、好ましい。

+0

イテレータがポインタの場合、最初のものは無効です。他の2つは問題ありません。 –

+0

もう1つはランダムアクセスコンテナに制限されています。 – MSalters

+0

@MSalters質問は 'std :: vector'についてです。 – Barry

4

あなたは何が必要

cplusplus reference

auto last = container.rbegin(); 
+1

しかし、 'rbegin'はイテレータを返さず、reverse_iteratorを返します。 –

+0

@ MarkRansomイテレータの一種であり、 'std :: vector :: iterator'ではありません。 – immibis

+1

別の解決策は、イテレータの代わりに整数インデックス '.size()'を保存することです。 –

6

を行いrbeginあなたはポストインクリメントが後まで値を変更しませんので、それはあなたの間違ったイテレータを与える行っている方法を持っています割り当て。

常にあります:

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

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

関連する問題