back_inserter

之前使用std::copy时总是会需要先调用resize()方法将目标容器扩容, 简单对象不会有太多问题(但也会为元素付default值), 如果对象有构造函数就比较恶心了 如:

class Foo

{

Foo(){ a = 5 }

int a;

}


std::vector vec1;

vec1.push_back(......);

...... // 若干push_back

std::vector vec2;

vec2.resize(vec1.size()); // 会调用 n 次Foo的默认构造(即使会内联)

std::copy(vec1.begin, vec1.end, vec2.begin());


可以改为

std::vector 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 无法这样做, 因为 list::end() 与 vector::end() 实现不同, vector::end 是某个具体的位置, 而 list::end 是某个具体的值


参考: 

std::back_inserter 会调用容器的push_back() 方法

std::front_inserter 会调用容器的push_front() 方法 // 故: vector 不支持

std::inserter 会调用容器的insert() 方法



你可能感兴趣的:(back_inserter)