C ++ STL unordered_map迭代器问题

时间:2011-03-14 11:39:29

标签: c++ stl iterator unordered-map

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)?或者只是保存指针/引用键和值?

5 个答案:

答案 0 :(得分:3)

迭代器是可分配的,而地图中的键和值必须是可复制的,它们不需要是可分配的。

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

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

答案 1 :(得分:2)

这是一个相关的容器:
这意味着它在内部存储键/值对(称为value_type)。

迭代器提供重载*和 - &gt;运算符,为您提供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;
}

答案 2 :(得分:1)

无法保证。但是,迭代器很有可能存在指针。如果使用可变迭代器,则可以修改数据,因此没有复制,并且在使用const版本时我无法想到制作副本的原因。

但是,您的代码是依赖于这些考虑还是仅仅是出于好奇?

答案 3 :(得分:1)

迭代器&amp; const_iterator保存指向数据的指针。如果找不到你的值,它应返回m_fileMap.end()。

答案 4 :(得分:0)

unordered_map包含一对键\值(按值),const_iterator包含指向该对的指针。您可以通过 - &gt;。

访问其成员来取消引用迭代器
相关问题