2011-03-14 83 views
1
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)的副本?或者它只是持有指針/參考的關鍵和價值?C++ STL unordered_map迭代器問題

回答

3

迭代器是可分配的,雖然映射中的鍵和值必須是可複製的,但它們不需要可賦值。

因此它不能在一般情況下使用副本,它必須在內部持有指針或引用。

在某些情況下,例如整數,它可能會專門化和使用副本。

1

沒有保證。但是,迭代器擁有指針的機會很大。如果你使用可變迭代器,你可以修改數據,所以沒有複製,並且我不能想到在使用const版本時做複製的理由。

但是,你的代碼是依賴於這樣的考慮還是隻是出於好奇?

+0

嗯,其實我只是好奇它是如何工作。所以我會確定使用'std :: tr1 :: unordered_map fileMap;'是有效的,因爲它不會創建鍵和值的副本。 – MorrisLiang

+0

你不應該多想這件事。編譯器會優化大量副本。因此,儘量避免複製會導致複雜的代碼,並且可能會因爲編譯器丟失並且不會進行優化而變慢。 –

0

unordered_map持有一對key(值)(值),並且const_iterator持有指向該對的指針。您通過 - >來訪問其成員,從而取消引用迭代器。

1

迭代器& const_iterator持有指向您的數據的指針。在這裏它應該返回m_fileMap.end()如果你的值沒有找到。

2

它是一個關聯的容器:
這意味着它在內部存儲鍵/值對(被稱爲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; 
} 
+0

那麼,我知道如何使用它們。但在幕後,迭代器如何管理資源?它是否 - >首先是一個std :: wstring(這裏的關鍵)的副本?因爲如果這樣做,那麼它會損害性能。 – MorrisLiang

+0

@Morris:沒有操作符 - >返回一個指向'value_type'的指針,它有兩個成員(第一,第二)。由於它是對'value_type'的引用,因此不會複製密鑰(除非您明確地創建副本(例如,通過分配給變量))。 PS大多數STL實現都進行了優化,以便字符串複製相對便宜。 –

+0

現在我明白了所有的東西。容器將值作爲value_types存儲在其中。迭代器(比如)指向value_type的指針。所以不會有任何複製。 – MorrisLiang