Вставка в карту типа в C++

Я не понимаю, что делает этот кусок кода

static TwoWayHostPair hostpair;
map <TwoWayHostPair, Traffic> mymap;
//here some map element inserted to mymap and hostpair initialized

map <TwoWayHostPair, Traffic>::iterator iter = mymap.begin();
iter = mymap.find(hostpair);
if (iter == mymap.end()) { 
    iter = mymap.insert(make_pair(hostPair, Traffic())).first; //line8
}

У меня вопрос, что происходит в line8? Я не получил это. Разве это не должно быть типа map<...>:iterator и после этой вставки он остается того же типа?

4 ответа

Решение

std:: map:: insert return std:: pair<итератор, bool>, приведенное ниже утверждение верно. второе возвращаемое значение bool указывает, произошла ли вставка

iter = mymap.insert(make_pair(hostPair, Traffic())).first; //line8

см ссылку здесь

Как здесь используется,

iter = mymap.insert(make_pair(hostPair, Traffic())).first; //line8

mymap.insert возвращает pair<iterator,bool>, firstзатем получает доступ к iterator,

insert(make_pair......

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

РЕДАКТИРОВАТЬ Обратитесь к карте cplusplus, чтобы узнать больше.

iter = mymap.find(hostpair);
if (iter == mymap.end()) { 
    iter = mymap.insert(make_pair(hostPair, Traffic())).first; //line8
}

Первая строка ищет ключ hostPair на карте, и если он не найден, то он входит в if блок, в который он вставляет ключ вместе со своим значением, и .first возвращает итератор для вставленного элемента.


улучшение

Но вы можете улучшить это. Вы могли бы просто написать это:

iter = mymap.insert(make_pair(hostPair, Traffic())).first; 

что в точности соответствует вашему коду. Не нужно использовать find а потом insert, Результатом является повышение производительности.

Если ключ уже существует, insert Функция НЕ вставит какой-либо элемент на карту и .first вернет вам итератор найденного элемента. Если ключ не существует, только тогда он вставит и .first вернет вам итератор для вновь вставленного элемента.

Если вы хотите узнать, существует ли ключ, или нет, то вы можете сделать это:

auto pair = mymap.insert(make_pair(hostPair, Traffic())); //NO .first!
if (pair.second)
{
     //a newly created item is inserted 
     auto iter = pair.first; //iterator to the newly inserted item
}
else
{
    //an item with key `hostPair` already exists in the map
     auto iter = pair.first; //iterator to the found item
}

Надеюсь, это поможет.

Другие вопросы по тегам