插入迭代器inserter在copy函数的运行机制是啥
我认为front_inserter / inserter的意思应该是push_front和push_back。
■网友
这是copy的源码:template\u0026lt;class InputIterator, class OutputIterator\u0026gt; OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result){ while (first!=last) { *result = *first; ++result; ++first; } return result;}这是insert_iterator的相关源码:insert_iterator\u0026lt;Container\u0026gt;\u0026amp; operator= (typename Container::value_type\u0026amp;\u0026amp; value) { iter=container-\u0026gt;insert(iter,std::move(value)); ++iter; return *this; } insert_iterator\u0026lt;Container\u0026gt;\u0026amp; operator* () { return *this; } insert_iterator\u0026lt;Container\u0026gt;\u0026amp; operator++ () { return *this; }copy(lst.cbegin(),lst.cend(),inserter(lst3,lst3.begin()));相当于:first = lst.cbegin();last = lst.cend();result = inserter(lst3,lst3.begin()); while (first!=last) { *result = *first; ++result; ++first; }*result = *first;这一行会使用到operator* 这个“*”重载操作符,返回的是*this。并且会使用到operator = 这个“=”的重载操作符。这个“=”的操作符会通过list容器的iterator insert (const_iterator position, const value_type\u0026amp; val)成员函数插入元素的值,并将新的待插入的位置赋值给iter(也就是相当于接下来的元素可以插入的位置,是list中刚才插入的元素的下一个位置),返回值就是An iterator that points to the first of the newly inserted elements.所以其实就是如轮子哥所说,一直在“push_back”。
■网友
以下引用自sherlly666的博客:
除了普通迭代器,C++标准模板库还定义了几种特殊的迭代器,分别是插入迭代器、流迭代器、反向迭代器和移动迭代器,定义在\u0026lt;iterator\u0026gt;头文件中,下面主要介绍三种插入迭代器(back_inserter,inserter,front_inserter)的区别。
首先,什么是插入迭代器?插入迭代器是指被绑定在一个容器上,可用来向容器插入元素的迭代器。
back_inserter:创建一个使用push_back的迭代器。
inserter:此函数接受第二个参数,这个参数必须是一个指向给定容器的迭代器。元素将被插入到给定迭代器所表示的元素之前。
【插入迭代器inserter在copy函数的运行机制是啥】 front_inserter:创建一个使用push_front的迭代器(元素总是插入到容器第一个元素之前)。list\u0026lt;int\u0026gt; lst = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };list\u0026lt;int\u0026gt; lst2 ={10}, lst3={10},lst4={10};copy(lst.cbegin(), lst.cend(), back_inserter(lst2));//lst2包含10,1,2,3,4,5,6,7,8,9copy(lst.cbegin(), lst.cend(), inserter(lst3, lst3.begin()));//lst3包含1,2,3,4,5,6,7,8,9,10copy(lst.cbegin(), lst.cend(), front_inserter(lst4));//lst4包含9,8,7,6,5,4,3,2,1,10
■网友
C++ Primer 5th,p358对这个问题有较详细解释.
书上有句:元素将被插入到给定迭代器所表示的元素之前(这句话很会被误解)
我的理解是inserter将元素分成容器本身(旧元素)存在的元素和新插入的元素,比如插入1后,再插入2,分为新插入的元素1和本身存在的元素(也就是空),此时copy(lst.cbegin(),lst.cend(),inserter(lst3,lst3.begin()));这里的lst3.begin()是指向旧元素的迭代器,所以就是1 2而不是2 1。
推荐阅读
- 有解析解,为啥还要迭代算数值解
- 通信技术迭代是否过快指的是手机通信从2G向5G的过渡
- FAQ-为啥要迭代开发
- mysql myisam引擎,插入unique数据用不满cpu等硬件是啥原因
- ZEALER|“换药不换汤”,还是“换汤不换药”,FIIL CC2的迭代升级你满意吗?
- 线性方程组的迭代求解法的收敛性怎样保证
- 蔚来|亚洲产业迭代与欧洲产业崛起主题论坛在宁德市举行
- 关于Python3中reduce函数及可迭代的问题
- codeblocks怎么样插入外部头文件
- 创业之初难以找到需要的技术人员外包是否会对后期迭代产生影响
