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)吗?或者它只包含指向键和值的指针/引用?
发布于 2011-03-14 20:09:13
迭代器是可分配的,虽然map中的键和值必须是可复制的,但它们不需要是可分配的。
因此,在一般情况下,它不能使用副本,它必须在内部保存指针或引用。
在某些情况下,例如In,它可能会专门化并使用副本。
发布于 2011-03-14 20:50:37
它是一个关联的容器:
这意味着它在内部存储键/值对(称为value_type)。
提供的迭代器重载*和->操作符,以提供对value_type的引用。哪一个是std::对
因此,您可以尝试这样做:
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;
}发布于 2011-03-14 19:51:59
这是没有保证的。然而,迭代器持有指针的可能性很大。如果使用可变迭代器,则可以修改数据,因此不会创建副本,并且在使用const版本时,我想不出有什么理由要创建副本。
但是,您的代码依赖于这些考虑因素还是出于好奇心?
https://stackoverflow.com/questions/5298051
复制相似问题