Вывод: строка «0 1», затем missing, затем 1. operator[] создаёт отсутствующий элемент со значением int, равным нулю; at бросает исключение и не вставляет ключ.
Что произойдёт при operator[] и at у пустой std::map?
Вывод: строка «0 1», затем missing, затем 1. operator[] создаёт отсутствующий элемент со значением int, равным нулю; at бросает исключение и не вставляет ключ.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Что выведет следующий код C++?
#include <map>
#include <iostream>
#include <stdexcept>
int main() {
std::map<int, int> m;
std::cout << m[7] << ' ' << m.size() << '\n';
try { std::cout << m.at(9) << '\n'; }
catch (const std::out_of_range&) { std::cout << "missing\n"; }
std::cout << m.size() << '\n';
}
Ответ
Вывод: строка «0 1», затем missing, затем 1. operator[] создаёт отсутствующий элемент со значением int, равным нулю; at бросает исключение и не вставляет ключ.
После обращения m[7] контейнер содержит единственную пару {7, 0}. Поиск m.at(9) не находит ключ и попадает в catch, поэтому размер остаётся прежним. Для чтения без побочных эффектов используйте find, contains при подходящей версии C++ или at, если отсутствие ключа должно быть исключительной ситуацией. operator[] не подходит для проверки существования без изменения контейнера.
Источник: eel.is.