Поведение std::vector при добавлении нового элемента с помошью push_back оказалось для меня неожиданным. Ниже приведён исходный текст программы и результат её работы:
#include <string>
#include <vector>
#include <iostream>
class Foo
{
public:
Foo(const std::string& n):
name(n)
{ std::cout << "Foo(const std::string&)(" << name << ")" << std::endl; }
Foo(const Foo& f):
name(f.name)
{ std::cout << "Foo(const Foo&)(" << name << ")" << std::endl; }
~Foo()
{ std::cout << "~Foo(" << name << ")" << std::endl; }
private:
std::string name;
};
int main(int argc, char* argv[])
{
std::vector<Foo> v;
v.push_back(Foo("a"));
v.push_back(Foo("b"));
v.push_back(Foo("c"));
return 0;
}
Foo(const std::string&)(a)
Foo(const Foo&)(a)
~Foo(a)
Foo(const std::string&)(b)
Foo(const Foo&)(a)
Foo(const Foo&)(b)
~Foo(a)
~Foo(b)
Foo(const std::string&)(c)
Foo(const Foo&)(a)
Foo(const Foo&)(b)
Foo(const Foo&)(c)
~Foo(a)
~Foo(b)
~Foo(c)
~Foo(a)
~Foo(b)
~Foo(c)
Я ожидал, что конструктор будет вызван 6 раз (из них 3 раза копирующий), а получилось, что при добавлении элемента в конец вектора перебираются все его элементы. При этом ещё и создаются их временные копии. В исходниках std::vector сам чёрт ногу сломит. Не подскажите, где можно почитать про особенности реализации данного контейнера. У Страуструпа ничего толкового не нашёл (или просто искал плохо?).