質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iteratorパターン

iteratorパターンとは、オブジェクト指向プログラミングのデザインパターンです。コンテナオブジェクトの要素を列挙する手段を独立させることによって、コンテナの内部仕様に依存しない反復子を提供することを目的とします。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1716閲覧

vectorとiterator

tyapapa

総合スコア51

iteratorパターン

iteratorパターンとは、オブジェクト指向プログラミングのデザインパターンです。コンテナオブジェクトの要素を列挙する手段を独立させることによって、コンテナの内部仕様に依存しない反復子を提供することを目的とします。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/05/27 03:06

C++

1std::vector<example> ex_vec; // exampleのベクター 2std::vector<example>::iterator itr; // exampleのベクターを指すイテレータ 3 4itr = ex_vec.begin(); 5while(1) 6{ 7 // ベクターの最後の要素をイテレータが指す時 8 if( itr == ex_vec.back() ) 9 { 10 // 処理をする 11 } 12 itr++ 13}

上記のような例で、
イテレータがベクターの最後の要素を指す時に処理を行いたい。
しかし、 if( itr == ex_vec.back() )で「==」のオペランドと一致する演算子==が存在しないエラーが出てしまいます。

.back()はベクターの最後の要素を指す認識で、iteratorとvectorの型も同じにしているのですが、
なぜできないのでしょうか?

何かほかに「vectorの最後の要素とiteratorが一致している」ことが分かる
良い方法があればご教授ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

back()が最後の要素の参照であることはmaisumakunさんも書かれている通りです。

何かほかに「vectorの最後の要素とiteratorが一致している」ことが分かる良い方法があればご教授ください。

end()は最後の要素の次を指すイテレータなので、空でないことを確認したうえで-1すれば最後の要素のイテレータになります。

C++

1if (!ex_vec.empty() && itr == ex_vec.end() - 1)

C++11ならイテレータを一つ前に戻したコピーを返すstd::prev()も使用できます。

C++

1if (!ex_vec.empty() && itr == std::prev(ex_vec.end()))

(要素の削除や挿入を行わないのであれば)ループ中で毎回空チェックや末尾要素のイテレータを求めるのは無駄なのでループ前に行うとよいです。

投稿2020/05/27 03:23

編集2020/05/27 04:43
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2020/05/27 04:08

(std::prev, std::next といった物の存在を知るきっかけになったという個人的理由により高評価)
guest

0

itr == ex_vec.end()-1とか
itr+1 == ex_vec.end()とかで良いのではないでしょうか.

投稿2020/05/27 03:26

fana

総合スコア11656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

.back()はベクターの最後の要素を指す認識で

はい、要素の参照を返します。イテレーターではありません(cpprefjp)。

投稿2020/05/27 03:14

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問