C ++ STL map, std :: pair в качестве ключа - PullRequest
4 голосов
/ 16 июня 2011

Вот как я определил карту.

std::map<std::pair<std::string,std::string>, int>  edMap;

Я не совсем понимаю, как вставлять значения, я всегда получаю ошибку компиляции. Вот как я пытаюсь вставить.

    std::pair<std::string,std::string> key;
    edMap.insert(key,d);

Ошибка компиляции

1>------ Build started: Project: spellsuggest, Configuration: Debug Win32 ------
1>Compiling...
1>breathalyzer.cpp
1>d:\personal\spellsuggest\spellsuggest\breathalyzer.cpp(70) : error C2664: 'std::_Tree<_Traits>::iterator std::_Tree<_Traits>::insert(std::_Tree<_Traits>::iterator,const std::pair<_Ty1,_Ty2> &)' : cannot convert parameter 1 from 'std::pair<_Ty1,_Ty2>' to 'std::_Tree<_Traits>::iterator'
1>        with
1>        [
1>            _Traits=std::_Tmap_traits<std::pair<std::string,std::string>,int,std::less<std::pair<std::string,std::string>>,std::allocator<std::pair<const std::pair<std::string,std::string>,int>>,false>,
1>            _Ty1=const std::pair<std::string,std::string>,
1>            _Ty2=int
1>        ]
1>        and
1>        [
1>            _Ty1=std::string,
1>            _Ty2=std::string
1>        ]
1>        and
1>        [
1>            _Traits=std::_Tmap_traits<std::pair<std::string,std::string>,int,std::less<std::pair<std::string,std::string>>,std::allocator<std::pair<const std::pair<std::string,std::string>,int>>,false>
1>        ]
1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>Build log was saved at "file://d:\personal\spellsuggest\spellsuggest\Debug\BuildLog.htm"
1>spellsuggest - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Ответы [ 3 ]

13 голосов
/ 16 июня 2011

Давайте попробуем:

typedef std::pair<std::string, std::string> my_key_type;
typedef std::map<my_key_type, int>          my_map_type;

my_map_type m;

m.insert(my_map_type::value_type(my_key_type("A", "B"), 43));

Обратите внимание, что value_type на карте всегда std::pair<const key_type, mapped_type>, так что в вашем случае это std::pair<my_key_type, int> - пара, первый член которой сам является парой!

Имея это в виду, вы можете альтернативно использовать make_pair:

m.insert(std::make_pair(my_key_type("C", "D"), -5));

Наконец, как указывает Свен, может существовать или не быть оператор сравнения для пар (хотя я думаю, что он есть); так что, если нет, вы должны написать один самостоятельно. Лексикографическое сравнение по двум элементам должно сделать. Софи ждет: -)

(Вот сравнение лексикографических пар; вам не нужно писать это, оно уже есть :)

template<typename S, typename T>
bool operator<(const std::pair<S, T> & a, const std::pair<S, T> & b)
{
   return (a.first < b.first) || (a.first == b.first && a.second < b.second);
}
3 голосов
/ 16 июня 2011

Метод вставки принимает полную пару типов карты, поэтому вы должны сделать это:

edMap.insert(make_pair(key, d));
0 голосов
/ 16 июня 2011

Обратите внимание, что это:

std::pair<std::string,std::string> key;
edMap.insert(make_pair(key,d));

не вставит ничего, если уже есть ключ с таким же значением.

Это, с другой стороны:

std::pair<std::string,std::string> key;
edMap[key] = d;

создаст новый элемент на карте или перезапишет предыдущее значение, если оно существовало.

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