之前使用std::copy时总是会需要先调用resize()方法将目标容器扩容, 简单对象不会有太多问题(但也会为元素付default值), 如果对象有构造函数就比较恶心了 如:
class Foo
{
Foo(){ a = 5 }
int a;
}
std::vector<Foo> vec1;
vec1.push_back(......);
...... // 若干push_back
std::vector<Foo> vec2;
vec2.resize(vec1.size()); // 会调用 n 次Foo的默认构造(即使会内联)
std::copy(vec1.begin, vec1.end, vec2.begin());
可以改为
std::vector<Foo> vec2;
vec2.reserve(vec1.size()); // 只分配空间, 不执行初始化
std::copy(vec1.begin, vec1.end, std::back_inserter(vec2)); // 这样 只是执行了应有的 拷贝动作, 没有多余的初始化动作
另外: 可以 将容器的数据拷贝到容器本身
std::copy(vec1.begin(), vec1.end(), std::back_inserter(vec1));
但 std::list<T> 无法这样做, 因为 list<T>::end() 与 vector<T>::end() 实现不同, vector::end 是某个具体的位置, 而 list::end 是某个具体的值
参考:
std::back_inserter 会调用容器的push_back() 方法
std::front_inserter 会调用容器的push_front() 方法 // 故: vector 不支持
std::inserter 会调用容器的insert() 方法