2014-11-07 4 views
1

Я пытаюсь использовать std :: unordered_map, как показано в the example here.std :: unordered_map с пользовательским типом значения, оператор []

class CSVRecord { 
public: 
    CSVRecord(string csvLine) : _fields(vector<string>()) {...} 
    vector<string> _fields; 
}; 

int main(int argc, char* argv[]) { 
    unordered_map<string, CSVRecord> m; 
    CSVRecord rec = CSVRecord("test"); 
    m["t"] = rec; 
    return 0; 
} 

Однако m["t"] = rec дает error: no matching function for call to ‘CSVRecord::CSVRecord()’.

Вместо этого я использовал m.insert(pair<string, CSVRecord>("t",rec)), но мне интересно, почему оригинал не работал.

ответ

6

Вы получаете эту ошибку из-за отсутствия конструктора по умолчанию в CSVRecord.

Как работает operator[]?

operator[] ищет ключ, предоставленный ему, и если элемент уже присутствует на карте, он возвращает ссылку на этот элемент. Если элемент отсутствует, он добавляет ключ с построенным по умолчанию объектом. В вашем случае он не смог найти соответствующий конструктор, следовательно, испустил ошибку.

+0

Спасибо, поэтому добавление элементов с помощью 'operator []' не рекомендуется из-за дополнительной копии, правильно? – dimid

+0

@Dimid: это удобная нотация, и по умолчанию сборка/копирование часто может быть устранена оптимизатором - очень редко нужно избегать «[]», но, как всегда, действительно действительно критичный по производительности код и видеть, где измерение ведет вас , –

Смежные вопросы