Вставка в карту типа в 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
}
Надеюсь, это поможет.