3

この質問は、実際のユースケースではなく、学術的な関心から私には見えました。

STL連想コンテナ、つまり[multi]setと[multi]mapには、次のようなオーバーロードされたメソッドが含まれています。

// for std::map
void erase ( iterator position );
size_type erase ( const key_type& x );

// for std::set
iterator  erase (const_iterator position);
size_type erase (const value_type& val);

私の質問:もしkey_type、それぞれ。または?value_type_iteratorconst_iterator

イテレータをコンテナに格納することは危険であり、おそらく役に立たないことを私は知っています。しかし、実際のSTL実装はどのように動作しますか?振る舞いも定義されていますか?

4

3 に答える 3

10

問題は、イテレータの型が異なるということです。それらが同じであることは決して起こり得ません。理由: この場合、次の等式が成り立つ必要がありました。

map<K, V>::iterator == K
map<K, V>::const_iterator == K

しかし、これらの等式は成立しません (再帰が見えますか?)。反復子の型は、テンプレート パラメーターを含め、コンテナーの型に依存することに注意してください。

したがって、次の例では、キーの型とイテレータの型が異なりますが、それらを等しくしようとしています。

map<map<int,int>::iterator, int> i;

実際、上記の理由により、キーがイテレータ型と等しいマップをインスタンス化することはできません。したがって、オーバーロードされたeraseメソッドは次のようになります。

void erase ( map<map<int,int>::iterator, int>::iterator position );
size_type erase ( const map<int,int>::iterator & x );

したがって、オーバーロードがあいまいになることはありません。タイプが等しい場合、あいまいになります。これを参照してください: http://ideone.com/fMdwru . ただし、メソッドを使用している限り、コンパイラは不平を言うだけです。ですから、ここであいまいさを導入できるとしましょう。メソッドを使用したい限り、それは私たちを悩ませるだけです。つまり、マップ タイプをインスタンス化することもできます (存在する場合)。

于 2013-01-08T13:23:19.363 に答える
6

イテレータをコンテナに格納することには、本質的に何の問題もありません。注意すべき主な問題は次の 2 つです。

  1. 各反復子が参照するコンテナーを知る必要がある場合があります。
  2. 元のコンテナに対するどの操作がどのイテレータを無効にするかを知る必要があります。

私の質問:もしkey_type、resp。または?value_type_iteratorconst_iterator

4 つの型すべてが同じコンテナー型を参照している場合、その答えは、定義上、同じにすることはできないということです。

于 2013-01-08T13:20:51.483 に答える
0

これを行うことに何の問題もありませんし、無駄でもありません。:)

イテレータは基本的に単なる一般化されたポインタであることを思い出してください。疑わしい場合は、ポインターのように動作すると想定してください。ポインターのコンテナーを作成できるので、イテレーターのコンテナーも作成できます。

もちろん、コンテナーを変更すると、そのコンテナーを指すイテレーターが無効になる可能性があることに注意する必要があります (実行される操作とコンテナーのタイプによって異なります)。有効。

于 2013-01-08T13:26:35.427 に答える