Как скопировать контейнеры STL?C++: эффективно копировать контейнеры
// big containers of POD
container_type<pod_type> source;
container_type<pod_type> destination
// case 1
destination = source;
// case 2
destination.assign(source.begin(), source.end());
// case 3 assumes that destination.size() >= source.size()
copy(source.begin(), source.end(), destination.size());
Я использую случай 1, когда это возможно. Случай 2 предназначен для контейнеров разных типов. Случай 3 необходим, когда место назначения больше, чем источник, и вы хотите сохранить остальные элементы.
Но как насчет не-POD-элементов с ненулевой стоимостью строительства/разрушения? Может ли случай 3 быть лучше, чем случай 2? Если назначение больше, чем источник, реализация может сделать довольно неожиданные вещи. Это то, что Visual Studio 2008 делает в случае 2.
- Все элементы места назначения уничтожены.
- Затем конструктор копирования вызывается столько раз, сколько размер адресата. Зачем?
- Все элементы источника назначаются соответствующим элементам назначения.
- Дополнительные элементы места назначения уничтожены.
GCC 4.5 лучше. Все элементы источника копируются через назначение, а затем удаляются дополнительные элементы адресата. Используя случай 3, за которым следует , размер делает то же самое на обеих платформах (кроме одного конструктора по умолчанию, который имеет размер). Вот игрушечная программа, которая показывает, что я имею в виду.
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;
struct A {
A() { cout << "A()\n"; }
A(const A&) { cout << "A(const A&)\n"; }
A& operator=(const A&) {
cout << "operator=\n";
return *this;
}
~A() { cout << "~A()\n"; }
};
int main() {
list<A> source(2);
vector<A> desrination1(3);
vector<A> desrination2(3);
cout << "Use assign method\n";
desrination1.assign(source.begin(), source.end());
cout << "Use copy algorithm\n";
copy(source.begin(), source.end(), desrination2.begin());
desrination2.resize(2);
cout << "The End" << endl;
return 0;
}
В чем вопрос? – onof
Я почти никогда не копирую контейнеры в свой собственный код (кажется, маловероятно, что вам нужно это делать), поэтому я никогда не рассматривал эту проблему. – 2010-07-31 08:37:20
@onof Как вы копируете свои контейнеры STL? – user401947