Ввод пары STL с картой STL - PullRequest
0 голосов
/ 12 января 2012
map <int, string> rollCallRegister;
map <int, string> :: iterator rollCallRegisterIter;

pair <map <int, string> , bool> returnPair;

rollCallRegister.insert (pair <int, string> (1, "anisha"));

В этом коде pair <map <int, string> , bool> returnPair; означает, что эта пара принимает строку карты в качестве первого значения и логическое значение в качестве второго.

Вопрос :
Как вставить bool здесь: rollCallRegister.insert (pair <int, string> (1, "anisha"));?

Во-вторых, pair <map <int, string> :: iterator, bool> returnPair; Эта пара принимает итератор map в качестве первого ввода.

Вопрос :
Чем он отличается от синтаксиса предыдущей пары, поскольку способ вставки остается прежним: rollCallRegister.insert (pair <int, string> (1, "anisha"));?

Ответы [ 3 ]

1 голос
/ 12 января 2012

Первое значение pair<map<int, string >, bool> - это , а не строка карты, это целая карта (поэтому, вероятно, не то, что вы ищете). Вторая пара, с другой стороны, связывает запись карты с логическим значением.

Что касается вставки, я не совсем понимаю ваш вопрос: в обоих примерах вы вставляете в map<int, string>; это не имеет никакого отношения к различным типам пар, которые вы определяете. Для создания экземпляров этих двух видов пар вам понадобится map в первом случае и итератор во втором:

pair<map<string, int>, bool> p1(rollCallRegister, true);
pair<map<string, int>::iterator, bool> p2(rollCallRegisterIter, false);

Edit:

Основываясь на комментариях, которые вы сделали по своему вопросу, я думаю, вы путаете содержание карты (pair<string, int>) и значение, возвращаемое insert (pair<map<string, int>::iterator, bool>).

Когда вы объявляете map<K,V>, его содержимое сохраняется в pair<K,V>. Поэтому, чтобы вставить новую запись в эту карту, вам нужно создать пару, содержащую ключ и значение, которое вы хотите вставить:

map<K,V> myMap;
pair<K,V> myEntry(key, value); // entry to insert

myMap.insert(myEntry);         //or you can create the entry on-the-fly
myMap.insert(make_pair(key, value));

Теперь, когда вы вставляете запись в карту, существует вероятность того, что ключ уже присутствовал. Если это так, то вставка должна быть «неудачной»: после вызова insert ключ все еще связан с прежним значением. Тем не менее, вызывающего следует предупредить, что он попытался вставить запись с ключом, который уже существовал на карте.

Это достигается тем, что insert возвращает pair<map<K,V>::iterator, bool>, где второе значение этой пары - логическое значение, указывающее, произошла вставка (ключ еще не присутствовал на карте) или нет. Первое значение - это итератор записи, соответствующей ключу. Эта запись содержит ключ и связанное с ним значение (либо только что вставленный, либо тот, который уже был там).

1 голос
/ 12 января 2012

Вы также не можете вставить bool в rollCallRegister , так как он принимает только int в качестве ключа и строку в качестве значения в текущей форме.

Если вы хотите, чтобы карта rollCallRegister содержала пару (int, string) в качестве ключа и bool в качестве значения , вам нужно изменить его на :

map <pair<int, string>, bool> rollCallRegister;
rollCallRegister.insert(std::make_pair(std::make_pair(yourint, yourstring), true/false));
0 голосов
/ 12 января 2012

Довольно тривиально: pair<pair <int, string>, bool>. Возможно, вы захотите посмотреть на make_pair.

...