繁体   English   中英

C ++ STL unordered_map迭代器问题

[英]C++ STL unordered_map iterator problem

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)吗? 还是只保留指向键和值的指针/引用?

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

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

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

它是一个关联的容器:
这意味着它在内部存储键/值对(称为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;
}

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

但是,您的代码是否基于这些考虑?还是出于好奇?

iterator和const_iterator持有指向您数据的指针。 如果找不到您的值,则应在此处返回m_fileMap.end()。

unordered_map拥有一对键/值(按值),而const_iterator拥有指向该对的指针。 您可以通过->访问迭代器来取消引用迭代器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM