簡體   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