std::copy_backward,逆序复制元素
<algorithm>
原型:
template<class BidirIt1, class BidirIt2>
BidirIt2 copy_backward(BidirIt1 first, BidirIt1 last, BidirIt2 d_last);
返回:
指向最后复制的元素的迭代器
注意:
BidirIt, BidirectionIterator,双向迭代器
复制重叠:
d_last要在[first, last) 之外
如果在范围之内,则行为未定义。
可能的实现:
templateBidirIt2 copy_backward(BidirIt1 first, BidirIt2 last, BidirIt2 d_last){ while(first != last) { *(--d_last) = *(--last); } return d_last;}
使用场景,想从把vector的某段元素后移一位,可以调用std::copy_backward(pos, finish - 2, finish - 1)
std::uninitialized_copy, 复制[first, last) 的元素到始于d_first的未初始化内存。
<memory>
原型:
template<class InputIt, class ForwardIt>
ForwardIt uninitialized_copy(InputIt first, InputIt last, ForwardIt d_first);
和下面这段代码作用相同:
for(; first != last ; ++d_first, (void)++first) ::new (static_cast(std::addressof(*d_first))) typename std::iterator_traits ::value_type(*first);// ::new, new expression//typename std::iterator_traits ::value_type, //对*first做了一个类型转换,//typename的作用是明确value_type是类型,不是成员变量//new (ptr) T, placement new, 在指向d_first的地方创建first
可能的实现:
1 template2 ForwardIt uninitialized_copy(InputIt first, InputIt last, ForwardIt d_first) 3 { 4 typedef typename std::iterator_traits ::value_type Value; 5 ForwardIt current = d_first; 6 try 7 { 8 for( ; first != last ; ++current , (void)++first) 9 {10 ::new (static_cast (std::addressof(*current))) Value(*first);11 }12 return current;13 }14 catch(...) {15 for(; d_first != current; ++d_first)16 d_first->~Value();17 throw;18 } 19 }
返回:
指向复制的最后一个元素的下一个元素的迭代器