[英]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.