Проблема итератора C ++ STL unordered_map - PullRequest
1 голос
/ 14 марта 2011
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)? Или он просто содержит указатели / ссылку на ключ и значение?

Ответы [ 5 ]

3 голосов
/ 14 марта 2011

итераторы могут быть назначены, и хотя ключи и значения в картах должны быть копируемыми, их не нужно назначать.

Поэтому в общем случае нельзя использовать копию, она должна содержать указатель или ссылку внутри..

В некоторых случаях, например, целые, он может специализироваться и в любом случае использовать копии.

2 голосов
/ 14 марта 2011

Это связанный контейнер:
Это означает, что он хранит пары «ключ / значение» внутренне (обозначается как 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;
}
1 голос
/ 14 марта 2011

iterator & const_iterator содержит указатель на ваши данные. Здесь он должен вернуть m_fileMap.end (), если ваше значение не найдено.

1 голос
/ 14 марта 2011

гарантии нет.Однако есть большие шансы, что итератор содержит указатели.Если вы используете изменяемые итераторы, вы можете изменять данные, чтобы не делать копий, и я не могу придумать причину делать копии при использовании константной версии.

Тем не менее, вы полагаетесь на кодтакие соображения или это просто из любопытства?

0 голосов
/ 14 марта 2011

unordered_map содержит пару ключ \ значение (по значению), а const_iterator содержит указатель на эту пару.Вы разыменовываете итератор, обращаясь к его членам с помощью ->.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...