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) 之外
如果在范围之内,则行为未定义。
可能的实现:
template<class BidirIt1, class BidirIt2> BidirIt2 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<void*>(std::addressof(*d_first))) typename std::iterator_traits<ForwardIt>::value_type(*first); // ::new, new expression //typename std::iterator_traits<ForwardIt>::value_type, //对*first做了一个类型转换, //typename的作用是明确value_type是类型,不是成员变量 //new (ptr) T, placement new, 在指向d_first的地方创建first
可能的实现:
1 template<class InputIt, class ForwardIt> 2 ForwardIt uninitialized_copy(InputIt first, InputIt last, ForwardIt d_first) 3 { 4 typedef typename std::iterator_traits<ForwardIt>::value_type Value; 5 ForwardIt current = d_first; 6 try 7 { 8 for( ; first != last ; ++current , (void)++first) 9 { 10 ::new (static_cast<void*>(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 }
返回:
指向复制的最后一个元素的下一个元素的迭代器