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がどのように機能するかです。key(std :: wstring)とvalue(FileData)のコピーを作成しますか?それとも、キーと値へのポインタ/参照を保持しているだけですか?

4

5 に答える 5

3

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

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

場合によっては、たとえばintsは、とにかくコピーを特殊化して使用することがあります。

于 2011-03-14T12:09:12.760 に答える
2

これは関連付けられたコンテナです。
これは、キーと値のペアを内部的に格納することを意味します(value_typeと呼ばれます)。

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

したがって、これを試すことができます:

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;
}
于 2011-03-14T12:50:36.553 に答える
1

保証はありません。ただし、イテレータがポインタを保持する可能性は非常に高くなります。可変イテレータを使用すると、データを変更できるため、コピーが作成されず、constバージョンを使用するときにコピーを作成する理由が考えられません。

しかし、コードはそのような考慮事項に依存していますか、それとも好奇心からですか?

于 2011-03-14T11:51:58.803 に答える
1

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

于 2011-03-14T11:52:32.813 に答える
0

unordered_mapkey \ valueのペア(値による)をconst_iterator保持し、そのペアへのポインタを保持します。->でメンバーにアクセスすることにより、イテレータの間接参照を行います。

于 2011-03-14T11:52:12.477 に答える