2016-12-05 6 views
1

Рассмотрим следующий код:Путаница с STL C++ контейнера оператор [] и значениями по умолчанию

unordered_map<string, vector<string>> hashtable; 
string s = "foo"; 
hashtable[s].push_back("bar"); 

Это похоже на работу, но это означает, что в третьей строке, это как добавление новой записи в хеш-таблице путем инициализации вектора строк в ключе «foo», а также добавления «bar» к этому пустому вектору. Моя путаница в том, как получилось, что мы не должны явно инициализировать вектор, как:

unordered_map<string, vector<string>> hashtable; 
string s = "foo"; 
vector<string> vec; 
vec.push_back("bar"); 
hashtable[s] = vec; 

Добавление к моей путаницы, когда мы имеем дело с вещами, как инициализация массивов в C++, это хорошо, чтобы явно инициализировать массив как так:

int array[10] = {0); 

Это необходимо, если мы хотим, чтобы убедиться, что массив инициализируется все значения равны 0, так как без него, не может быть значения для мусора, хранящиеся в памяти на том же месте массив был инициализирован в. Возвращаясь к моему первому вопросу с Hashtable, как мы знаем,

hashtable[s].push_back("bar"); 

не толкает «бар» в вектор со значениями для мусора?

Я понимаю, что мой вопрос не совсем понятен. Любые разъяснения с поведением оператора [] и значениями по умолчанию для контейнеров STL являются общими.

ответ

5
  1. Моя путаница в том, как получилось, что мы не должны явно инициализировать вектор с

Это ожидаемое поведение std::unordered_map::operator[], которая будет выполнять вставку со значением инициализируется отображенным значением если ключ не существует.

Возвращает ссылку на значение, которое отображается на ключ, эквивалентный ключу, выполняя вставку, если такой ключ еще не существует.

Это означает, что для hashtable[s].push_back("bar");, значение инициализирован std::vector (т.е. пустой std::vector) будет вставлен в первый, то вектор будет возвращен посредством ссылки на std::unordered_map::operator[]. Затем на вектор вызывается push_back("bar") (тогда его размер становится 1 и содержит один элемент).

  1. не нажимает «бар» в вектор со значениями мусора?

Нет, std::vector не такой же, как сырой массив, его размер является динамическим. Как объяснялось выше, инициализированный значением std::vector пуст, его размер равен 0, по-прежнему не содержит каких-либо элементов (и любых «значений мусора»).