Первое значение 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>
, где второе значение этой пары - логическое значение, указывающее, произошла вставка (ключ еще не присутствовал на карте) или нет. Первое значение - это итератор записи, соответствующей ключу. Эта запись содержит ключ и связанное с ним значение (либо только что вставленный, либо тот, который уже был там).