back_inserter

之前使用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() 方法



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值