2011-03-14 12 views
1
class Demo { 
    struct FileData { 
     int size; 
     BYTE* buffer; 
     DWORD flags; 
    }; 

    typedef std::tr1::unordered_map<std::wstring,FileData> FileMap; 
    FileMap m_fileMap; 

    void myFunc() 
    { 
     std::wstring name = L"TestFile.png"; 
     FileMap::const_iterator iter = m_fileMap.find(name); 
     std::cout << iter->first; 
    } 
}; 

上記のコードを見てください。私の問題は、FileMap :: const_iteratorがどのように機能するかです。 キー(std :: wstring)と値(FileData)のコピーを作成しますか?それとも、ポインタとキーと値の参照だけを保持しているのでしょうか?C++ STL unordered_mapイテレータ問題

答えて

3

イテレータは割り当て可能であり、マップ内のキーと値はコピー可能でなければならず、割り当て可能である必要はありません。

したがって、一般的なケースでコピーを使用することはできません。内部でポインタまたは参照を保持する必要があります。

intのように、それはとにかくコピーを特化して使用することがあります。

1

保証はありません。しかし、イテレータがポインタを保持するチャンスがあります。変更可能なイテレータを使用している場合、データを変更することができますので、コピーは作成されません。また、constバージョンを使用する場合はコピーを作成する理由が考えられません。

しかし、あなたはそのような考慮事項に頼っているのですか、それとも好奇心から外れていますか?

+0

まあ、実際に私はそれがどのように機能するかについてだけ興味がありました。したがって、 'std :: tr1 :: unordered_map fileMap; 'を使うことは、キーと値のコピーを作成しないので効率的です。 – MorrisLiang

+0

あなたはそれについて多く考えるべきではありません。コンパイラは多くのコピーを最適化します。だから、コピーを避けようとすると、多くの場合複雑なコードが発生し、コンパイラが失われて最適化されないため、おそらく遅くなります。 –

0

unordered_mapは、キー\値(値による)のペアを保持し、const_iteratorはそのペアへのポインタを保持します。イテレータを参照するには、 - >でそのメンバーにアクセスします。

1

イテレータ& const_iteratorデータへのポインタを保持します。値が見つからない場合は、ここでm_fileMap.end()を返します。

2

関連するコンテナ:
これは、その内部にキー/値のペアが格納されていることを意味します(value_typeとして参照されます)。

イテレータは、*および - >演算子をオーバーロードして、value_typeへの参照を提供します。 std ::ペア

であるこのようにあなたはこれを試すことができます。

FileMap::const_iterator iter = m_fileMap.find(name); 
if (iter != m_fileMap.end()) 
{ 
    FileMap::value_type const& value = *iter; 

    FileMap::key_type const& key = iter->first; /* value.first */ 
    FileMap::data_type const& data = iter->second; /* value.second */ 

    // Alternatively: 
    // Assuming this hold: typedef std::tr1::unordered_map<std::wstring,FileData> FileMap; 
    std::wstring const& key1 = iter->first; 
    FileData  const& data1 = iter->second; 
} 
+0

さて、私はそれらの使い方を知っています。しかし、シーンの背後にある反復子マネージャはどのようにリソースを使いますか? iter->最初はstd :: wstring(ここのキー)のコピーですか?もしそうであれば、パフォーマンスが損なわれるからです。 – MorrisLiang

+0

@Morris:no operator - >は、2つのメンバ(first、second)を持つ 'value_type'へのポインタを返します。これは 'value_type'への参照なので、noキーがコピーされます(明示的にコピーを作成しない限り(例えば、変数に代入するなどして))。 PSのほとんどのSTL実装は、文字列のコピーが比較的安価になるように最適化されています。 –

+0

今私はすべてのものの考えを得る。コンテナは、内部にあるものをvalue_typeとして格納します。イテレータは、value_typeへのポインタ(like)です。したがって、コピーは一切含まれません。 – MorrisLiang

関連する問題