У меня есть следующий код:
#include <functional> // std::less
#include <map>
#include <iostream>
using namespace std;
class Key
{
public:
Key() {cout << "Key Constructor" << endl;}
~Key() {cout << "Key Destructor" << endl;}
Key(const Key& key) {cout << "Key Copy Constructor" << endl;}
bool operator < (const Key& k1) {return true;}
};
int main()
{
map<Key, int> mymap;
Key k;
cout << "operator[]"<<endl;
mymap[k] = 1;
map<Key, int> mymap2;
cout << "insert"<<endl;
mymap2.insert(std::make_pair(k, 1));
cout << "=========" << endl;
}
И результат:
$ g++ test.cpp -fpermissive
$ ./a.out
Key Constructor
operator[]
Key Copy Constructor
Key Copy Constructor
Key Destructor
insert
Key Copy Constructor
Key Copy Constructor
Key Copy Constructor
Key Copy Constructor
Key Destructor
Key Destructor
Key Destructor
=========
Key Destructor
Key Destructor
Key Destructor
Может кто-нибудь объяснить, почему mymap [k] = 1; invoke 2 copy constructor и mymap2.insert(std:: make_pair (k, 1)); вызывает 4 конструктора копирования? и означает ли это, что оператор [] намного эффективнее, чем вставка?
Спасибо.
Резюме:
Спасибо пользователю 6502 и petersohn за ваше понимание. Теперь я предполагаю, что причина для 2 дополнительных конструкторов копий для вставки такова:
- make_pair - это функция, она сначала выполняет функцию копирования внутри функции, а затем возвращает копию - это одна дополнительная копия
- make_pair (k, 1) создаст
pair<Key, int>
, но требуемый value_type будетpair<const& Key, int>
, преобразование типа приведет к другому дополнительная копия
Итак, в случае 2, если я использую:
mymap2.insert(std::pair<const Key, int>(k, 1));
Число вызываемых конструкторов копий будет одинаковым с оператором []
Как отмечалось в 6502 году, после претензии было изменено, следовательно, это не так:
Вызов этой функции (оператор []) эквивалентен: (* ((Этом- > вставки (make_pair (х, mapped_type()))). Первый)). Вторая
operator [] реализован иначе, чтобы избежать дополнительной копии, введенной make_pair()