首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ 中的迭代器back_inserter,该如何处理

2012-12-30 
C++ 中的迭代器back_inserter#include iostream#include list#include vector#include algorithm#

C++ 中的迭代器back_inserter

#include <iostream>
#include <list>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
vector<int> ivec;
list<int> ilist;
int tmp;
while (cin>>tmp)
ilist.push_back(tmp);//将元素赋值给ilist
back_inserter(ivec)=10;

replace_copy(ilist.begin(),ilist.end(),back_inserter(ivec),40,2);

vector<int>::iterator it=ivec.begin();//输出元素
for (; it!=ivec.end(); it++)
cout<<*it<<' ';
cout<<endl;
return 0;
}

我想问一下back_iterator 返回什么?? 好像这两个使用back_inserter的操作矛盾了,如果它返回迭代器那么back_inserter(ivec)=10;就不对了,如果不返回迭代器,那么replace_copy第三个参数又要求是迭代器,这不是矛盾了吗??
不知道back_inserter到底是干什么的,以及在这个例子中replace_copy到底是怎么实现的,很不解!!
C++primer中只说了怎么用,咱也不知道这里的原理。求解答。
[解决办法]
Copies the values of the elements in the range [first,last) to the range positions beginning at result, replacing the appearances of old_value by new_value.

實現原理大致是這樣:

template < class InputIterator, class OutputIterator, class T >
  OutputIterator replace_copy ( InputIterator first, InputIterator last,
                                OutputIterator result, const T& old_value, const T& new_value )
{
  for (; first != last; ++first, ++result)
    *result = (*first==old_value)? new_value: *first;
  return result;
}


// replace_copy example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };

  vector<int> myvector (8);
  replace_copy (myints, myints+8, myvector.begin(), 20, 99);

  cout << "myvector contains:";
  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;
 
  return 0;
}
[解决办法]
引用:
就这个程序中如果replace_copy的第三个参数自增,是不是会越界?? 
这种问题,直接去看一下back_inserter的实现不就知道了?back_inserter的自增运算符重载为什么都不做
[解决办法]
back_inserter返回的是back_insert_iterator迭代器,
back_insert_iterator继承于_Outit,即一个单步向前的只写迭代器。

back_inserter(ivec)=10;实际上是先构造一个back_insert_iterator,ivec当做成员变量存储,

explicit back_insert_iterator(_Container& _Cont)
: container(&_Cont)
{// construct with container
}

"=10"实际上调用了back_insert_iterator的等号重载函数,如下:

back_insert_iterator<_Container>& operator=(
typename _Container::const_reference _Val)


{// push value into container
container->push_back(_Val);//这里实际上是直接调用ivec的push_back
return (*this);//返回迭代器back_insert_iterator本身
}



?replace_copy  一楼已经给了源码了,以下面这个为例replace_copy(ilist.begin(),ilist.end(),back_inserter(ivec),40,2);
先将ilist中为40的元素替换为2,然后从ivec的起始位置依次插入到ivec.

[解决办法]
引用:
引用:自增越界的问题实际上不存在,因为back_insert_iterator的++操作符重载为直接返回*this,看下面这源码中的注释


C/C++ code
?



12345

back_insert_iterator<_Container> operator++(int)         {    ……
要搞清楚目的是什么,back_inserter进行赋值后实际是对容器进行了push_back操作,已经向后移动一个位置了,所以才把自增重载为什么都不做

热点排行