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

迭代器是可分配的,虽然映射中的键和值必须是可复制的,但它们不需要是可分配的。

因此它不能在一般情况下使用副本,它必须在内部保存一个指针或引用。

在某些情况下,例如整数,它可能会专门化并使用副本。

于 2011-03-14T12:09:12.760 回答
2

它是一个关联容器:
这意味着它在内部存储 Key/Value 对(称为 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_map保存一对键\值(按值),并const_iterator保存指向该对的指针。您可以通过 -> 访问迭代器的成员来取消对迭代器的引用。

于 2011-03-14T11:52:12.477 回答