首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ STL unordered_map迭代器问题

C++ STL unordered_map迭代器问题
EN

Stack Overflow用户
提问于 2011-03-14 19:39:29
回答 5查看 6.9K关注 0票数 1
代码语言:javascript
复制
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)吗?或者它只包含指向键和值的指针/引用?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-14 20:09:13

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2011-03-14 20:50:37

它是一个关联的容器:

这意味着它在内部存储键/值对(称为value_type)。

提供的迭代器重载*和->操作符,以提供对value_type的引用。哪一个是std::对

因此,您可以尝试这样做:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-03-14 19:51:59

这是没有保证的。然而,迭代器持有指针的可能性很大。如果使用可变迭代器,则可以修改数据,因此不会创建副本,并且在使用const版本时,我想不出有什么理由要创建副本。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5298051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档