copy算法

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 }

 返回:

  指向复制的最后一个元素的下一个元素的迭代器

 

原文地址:https://www.cnblogs.com/jimobuwu/p/8727697.html