2016-08-08 2 views
1

残念ながら、この:イテレータをキーとしてunordered_map、イテレータをlong longにキャストしますか?

unordered_map<list<int>::iterator, int> foo; 

が動作しない、コンパイラは言う:エラーC2338:C++標準は、このタイプのハッシュを提供していませんが。

はそうではなく

unordered_map<long long, int> foo; 

を使用し、単にlong longにイテレータをキャストするために保存され、ただし64ビット整数のハッシュがあるようですか?

答えて

1

いいえ、これは一般的に不可能です。 ポインタは整数型との間でキャストできますが(後で詳しく説明します)、イテレータは必ずしもポインタではないため、このキャストは必ずしも許可されません。たとえば、ストリームオブジェクトをラップするistream_iteratorのようなものを考えてみましょう。これをlong longとの間でキャストすることが何を意味するのかは不明です。この方法で問題を解決しようとしている場合は、アプローチを変更する必要があります。

注 - タイプlong longは実際には整数に変換されたポインタを保持するのに十分な大きさである必要はありません。 intptr_tuintptr_tの特殊タイプは、ポインタを格納するのに十分な大きさであることが保証されているので、代わりにそれらのタイプを使用したいことがあります。ただし、リストイテレータをこれらの型にキャストすることはできません。

+0

イテレータが指しているオブジェクトのアドレスの使用はどうですか?多分私はそれをキーとして使うことができますか? – testman

+0

これは、イテレータのようにポインタを扱う必要がなければ、うまくいくはずです。好奇心の中で、あなたは何をしようとしていますか?あなたは、あなたがこの問題を解決するもっときれいな方法を見逃しているかもしれないと思うので、あなたの目的を説明する別の質問を投稿したいかもしれません。 – templatetypedef

+0

私は重いオブジェクトのグラフを横断したいので、それらのオブジェクトに対するイテレータのベクトルを持っていますが、幅/深さの最初の検索に逆マッピングも必要です。おそらく効率的なグラフライブラリがありますが、私はこのトラバーサル関数よりもはるかに多くを必要としません。 – testman

関連する問題