Вызов функции на стандартном элементе карты без предварительной вставки - PullRequest
1 голос
/ 28 октября 2009

Следующий код в порядке?

class A
{
  public:
    A();
    void foo();
};

map<int,A> m;
m[0].foo();

Или я должен сделать следующее:

map<int,A> m;
m[0] = A();
m[0].foo();

А также, могу ли я сделать это:

map<int,A> m;
A a = m[5];

А как насчет доступа по ссылке:

void foo(A & a);
map<int,A> m;
foo(m[5]);

Ответы [ 3 ]

5 голосов
/ 28 октября 2009

map :: operator [] создаст новое значение на лету, если оно еще не существует. Так что все ваши примеры кода будут работать.

Тем не менее, этот пример:

 map<int,A> m;
 m[0] = A(); // redundant
 m[0].foo();

излишне, так как вторая строка избыточна.

1 голос
/ 28 октября 2009

Да, все они действительны. operator[] возвращает ссылку на половину значения пары ключ-значение, которая либо уже существовала, либо была вставлена ​​самим operator[] в вызов.

0 голосов
/ 28 октября 2009

Когда вы используете оператор '[]' для std :: map, новый объект будет создан по умолчанию автоматически, если еще не существует элемента с указанным идентификатором.

...