1. ホーム
  2. c++

[解決済み] イテレータの参照解除ができないのですが?

2022-03-03 16:09:51

質問

オブジェクトのベクトル(ポインタや参照ではない、プレーンなオブジェクト)がある場合、なぜこれができないのでしょうか?

Object* object;

object = vectorOfObjects.end();

または

object = &vectorOfObjects.end();

または

object = &(*vectorOfObjects.end());

また、'object' が参照であった場合にも同じ質問があります。

どのように解決するのですか?

3つのエラーに分かれています。

object = vectorOfObjects.end();

は動作しません。 end() はイテレータを返しますが object はポインタです。これらは一般に異なる型です(A vector できる はイテレータとして生のポインタを使用しますが、すべての実装がそうであるわけではありません。他のコンテナでは、特別なイテレータ型が必要です)。

object = &vectorOfObjects.end();

がうまくいかないのは、返されたイテレータのアドレスを取るからです。つまり、イテレータへのポインタではなく Object .

object = &(*vectorOfObjects.end());

は動作しません。 end イテレータは有効な要素を指していません。イテレータは有効な要素を指しておらず、シーケンスの終端を越えています。そのため、イテレータを参照することはできません。シーケンスの最後の要素を参照することはできます(これは --vectorOfObjects.end() を指すイテレータは使用できません。 過去 を終了します。

最後に、根本的な問題/混乱は、イテレータがポインタに変換できると考えていることかもしれません。一般的には、それはできません。コンテナがベクトルであれば、配列のように要素が連続的に割り当てられることが保証されているので、ポインタが機能します。しかし、例えば list 要素へのポインターは役に立ちません。要素へのポインタは役に立ちません。 要素で構成されます。