介绍一个很好用的overwrite 迭代器

原创 2004年04月15日 16:06:00

介绍一个很好用的overwrite 迭代器<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

【原标题】C++ Tip11 Overwrite Iterator

【出处】C++ User Journal December 2002 Volume 20 Number 12

【作者】Ray Virzi

【译者】easyjoy

【关键字】迭代器 容器 拷贝

【摘要】本文介绍了一个新迭代器(overwrite_iterator),可以在不清除容器原有元素的情况下,很方便的直接覆盖拷贝来自某个序列的新元素;并根据需要自动增长容器的大小。

 

【正文】

如果你要把一个序列(sequence)拷贝到一个容器(container)中去,通常你用std::copy算法,代码如下:

std::copy(start, end, std::back_inserter(container));

 

这里,startend是输入序列(假设有N各元素)的迭代器(iterator),container是一个容器,该容器的接口包含函数push_back。假设container开始是空的,那么copy完毕后它就包含N个元素,并且顺序与原来队列中的元素顺序一样。标准库提供的back_inserter模板函数很方便,因为它为container返回一个back_insert_iterator迭代器,这样,复制的元素都被追加到container的末尾了。

 

现在假设container开始非空(例如:container必须在循环中反复被使用好几次)。那么,要达到原来的目标,必须先调用clear函数然后才能插入新序列。这会导致旧的元素对象被析构,新添加进来的被构造。不仅如此,container自身使用的动态内存也会被释放然后又创建,就像listmapset的节点。某些vector的实现在调用clear的时候甚至会释放所有内存。通常,考虑到在一个已有的元素上直接copy覆盖更高效。也许你会这样做:

std::copy(start, end, container.begin());

 

在这里你在container的头部执行了copyover(覆盖赋值)操作,但是,如果container的大小小于输入序列的长度N的话,这段代码会导致崩溃(crash)。现在需要一个新迭代器,这个新迭代器在到达container的末尾之前执行copyover操作,之后执行append操作。我给这个迭代器命名为overwrite iterator,其定义见代码清单1;并遵循标准库的惯例,提供两个辅助模板函数(helper template function),来从指定容器构造overwrite iterator,见代码清单2

 

现在使用辅助函数,用下面的代码就可以达到我们开始的目的:

std::copy(start, end, overwriter(container));

 

如果你要从容器的某个迭代器指定位置开始拷贝的话,可以用下面的代码:

std::copy(start, end, overwriter(container, it));

 

这个copy算法执行结果返回一个overwrite迭代器,指向container中被拷贝的元素的下一个位置。由于这个迭代器有一个到container原来迭代器it的隐式转换(implicit conversion),因此可以很方便的被用来删除容器中剩下的元素(如果有这个需要的话),或者把另外一个序列中的元素复制接着拷贝过来。所以该解决方案式高效的、弹性的、安全的,更重要的是易用的。

 

【代码清单1overwrite_iterator的实现

#include <iterator>

 

template<class Cont>

    class overwrite_iterator

        : public std::iterator<std::output_iterator_tag, void, void> {

public:

    typedef Cont container_type;

    typedef Cont::value_type value_type;

    explicit overwrite_iterator(Cont& x)

        : cont(x), iter(x.begin())

    {}

    overwrite_iterator(Cont& x, Cont::iterator it)

        : cont(x), iter(it)

    {}

    overwrite_iterator& operator=(const Cont::value_type& val)

    {

        //iter == cont.end() ? cont.push_back(val) : (*iter = val, ++iter); thx to sky1234

iter == cont.end() ? (cont.push_back(val), iter=cont.end() ): (*iter = val, ++iter);

        return *this;

    }

    overwrite_iterator& operator*()

    {

        return *this;

    }

    overwrite_iterator& operator++()

    {

        return *this;

    }

    overwrite_iterator operator++(int)

    {

        return *this;

    }

    operator Cont::iterator()

    {

        return iter;

    }

protected:

    Cont& cont;

    Cont::iterator iter;

    };

 

【代码清单2】辅助函数(helper function

template<class Cont>

overwrite_iterator<Cont> overwriter(Cont& x)

{

    return overwrite_iterator<Cont>(x);

}

 

template<class Cont>

overwrite_iterator<Cont> overwriter(Cont& x, Cont::iterator it)

{

    return overwrite_iterator<Cont>(x, it);

}

  

作者介绍:略。

一个很好用的归并排序

//第一天学麻省理工的算法导论,写出了那个归并排序,自己给它添加了好多功能,你只要输入要测试多少组数据,他便会自动生成并将输入写入in.txt中,即使没有它也会自动创建,输出也一样 #include...
  • u010103165
  • u010103165
  • 2014年03月06日 09:42
  • 184

一个很好用的分页控件

一个很好用的分页控件,本来想将用户控件的时候说的,但是既然涉及到了,就简单的说下用法 控件大家可以找我要,小白和小贝也都有,也可以从这个地址下载: http://download.csdn.net...
  • mynewdays
  • mynewdays
  • 2012年05月07日 18:21
  • 860

很好用的一个轮播图

请参考链接:http://www.jq22.com/jquery-info3732
  • qq_36354609
  • qq_36354609
  • 2017年09月29日 08:37
  • 72

一个很好用的软件

H-JTAG可以调试和烧写flash,速度比三星的sjf2410快的多。www.hjtag.com
  • yd4330152763132
  • yd4330152763132
  • 2010年02月01日 02:39
  • 677

一个很好用的大数模板

下面是一个很好用的大数模板,提供了正整数大数的基本运算 #include #include #include #include #include #include using namespace s...
  • qq_33414630
  • qq_33414630
  • 2016年02月27日 16:37
  • 233

dreamweaver很好用但是。。。。。

我在与之间写入第一个ASP程序当前日期年份:年结果
  • zjiac1989627
  • zjiac1989627
  • 2009年12月06日 17:45
  • 108

ise使用

点击 generate programming file,对文件进行综合映射编译看看报没报错,没报错的话,点击use constrains,pre synshthes配置管脚,配置好重新generat...
  • yaoyurong7784
  • yaoyurong7784
  • 2017年11月27日 16:27
  • 43

2分钟亲密接触AutoCAD 2009

原贴地址:http://rkmcswain.blogspot.com/2008/02/autocad-2009-in-2-minutes.html翻译:才鸟(www.objectarx.net )欢迎...
  • zenghf7878
  • zenghf7878
  • 2008年02月19日 15:39
  • 3551

C++函数返回迭代器类型时应注意的点

今天在学习C++ PRIMER第九章时, 课后练习9.5中,编写一个用迭代器查询vector内元素的函数,找到后返回迭代器, 一开始我的函数声明是这样的: vector::iterator iSear...
  • ze0907
  • ze0907
  • 2016年11月05日 16:41
  • 1181

一个很好用excel导出类

  • manwea
  • manwea
  • 2013年11月27日 13:35
  • 458
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:介绍一个很好用的overwrite 迭代器
举报原因:
原因补充:

(最多只允许输入30个字)