front inserters and back inserters在deque中,vector的区别解决方法

front inserters and back inserters在deque中,vector的区别
C/C++ code
deque<int>q;

    front_insert_iterator<deque<int>> iter(q);
    *iter=12;
    *iter=23;
    *iter=1782;
    *iter=72223;
    
    
    copy(q.begin(),q.end(),ostream_iterator<int>(cout," ")); //打印结果逆序
    cout<<endl;
    copy(q.begin(),q.end(),front_inserter(q));
    copy(q.begin(),q.end(),ostream_iterator<int>(cout," ")); //第三个参数是destniation
    cout<<endl;

将q中的72223 1782 23 12  以逆序插入到 front_inserter(q)中,方式是逆序

所以结果最终为:12 23 1782 72223 72223 1782 23 12


由于deque 最终没有足够的空间,插入逆序插入过程中,空间不断变化,很可能导致q.begin(),q.end()失效。

这里为什么没有失效????






以下是back inserters 在vector中的用法, 迭代器失效了

C/C++ code
vector<int> coll;
  back_insert_iterator<vector<int>> iter(coll);
  *iter=1;
  iter++;
  *iter=2;
  iter++;
  *iter=3;

  copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
  cout<<endl;

  back_inserter(coll)=44;
  back_inserter(coll)=45;
   copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
  cout<<endl;

 copy(coll.begin(),coll.end(),back_inserter(coll));//这里是不是造成,出现随机数的原因????

   copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
  cout<<endl;


运行结果为:
1 2 3
1 2 3 44 45
1 2 3 44 45 1 2 -572662307 -572662307 -572662307
请按任意键继续. . .


copy(coll.begin(),coll.end(),back_inserter(coll)); 调用之前,coll的尺寸不变,

back_inserter后,coll尺寸加倍。




为什么在deque中迭代器没有失效,在vector中失效



------解决方案--------------------
http://www.cplusplus.com/reference/std/iterator/front_insert_iterator/[/url]
这个网站的资料不错,你可以经常看看
我的编译器输出是正常的,你的用法都是标准用法没有问题
输出结果是:
C/C++ code

1 2 3
1 2 3 44 45
1 2 3 44 45 1 2 3 44 45

------解决方案--------------------
deque的一般实现是链表连顺序表
比如插入之前有如下值
1-2-3-4
插入之后是
5-6-7-8 ~ 1-2-3-4
在1的前面另外开辟了一段空间存放5678,1本身的位置没动
------解决方案--------------------
用vs2010,会直接蹦出异常来。