zoukankan      html  css  js  c++  java
  • 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 }

     返回:

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

     

  • 相关阅读:
    中值定理
    poj 3984 迷宫问题 bfs
    android 处理网络状态——无网,2g,3g,wifi,ethernet,other
    POJ 1273 || HDU 1532 Drainage Ditches (最大流模型)
    Android硬件加速
    Android的横竖屏切换
    滑雪_poj_1088(记忆化搜索).java
    Rank of Tetris(hdu1811拓扑排序+并查集)
    git在windows下clone、pull或者push内存溢出的解决办法
    数据库中DDL、DML、DCL和TCP概念
  • 原文地址:https://www.cnblogs.com/jimobuwu/p/8727697.html
Copyright © 2011-2022 走看看