关于插入迭代器inserter

zhaoomeng 2013-03-14 09:37:25
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<list>
#include<iostream>
#include<string>
#include<algorithm>
#include<numeric>

using namespace std;

int main()
{
vector<int> vecINT,ivec;

for(int i=0;i!=5;++i)
{
vecINT.push_back(i);
}

copy(vecINT.begin(),vecINT.end(),inserter(ivec,ivec.begin()));

for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
cout<<*iter<<" ";
cout<<endl;

system("pause");
return 0;
}


运行结果:0 1 2 3 4
一、在上面那个程序中,inserter参数中的ivec.begin()是不是只在copy算法复制第一个值之前确定一次,以后都不在更新了呢?因为假如每次复制都更新的话,结果应该是4 3 2 1 0啊?哪位大神解释一下。
二、假如只更新一次的话,当ivec中元素增多,这个迭代器会失效,可是我把5改成20或更大的时候,程序都可以正常运行,这是为什么?

请大神赐教!!!
...全文
130 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
阻无雨风 2013-04-08
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/s/blog_93b45b0f01014o9p.html
这篇文章可能对楼主有用
zhaoomeng 2013-03-15
  • 打赏
  • 举报
回复
引用 8 楼 ForestDB 的回复:
LZ的这段代码,我这边不能编译呢。 不过我将ivec由vector改成list,结果OK。 基本上是LZ的说法。
抱歉,我搞错了,应该是list,而不是vector
  • 打赏
  • 举报
回复
引用 3 楼 ForestDB 的回复:
另外如下程序可以产生4 3 2 1 0,请对比 C/C++ code?12345678910111213141516171819# include <iostream># include <vector> using namespace std; int main(){ vector<int> v1, v2; for (int i = 0; i < 5; i……
顶这个,自习看书。我觉得C++ Primer对这个部分讲得比较细
ForestDB 2013-03-15
  • 打赏
  • 举报
回复
LZ的这段代码,我这边不能编译呢。 不过我将ivec由vector改成list,结果OK。 基本上是LZ的说法。
zhaoomeng 2013-03-15
  • 打赏
  • 举报
回复
引用 6 楼 ForestDB 的回复:
请上代码。。
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<list>
#include<iostream>
#include<string>
#include<algorithm>
#include<numeric>
 
using namespace std;
 
int main()
{
    vector<int> vecINT,ivec;
 
    for(int i=0;i!=5;++i)
    {
        vecINT.push_back(i);
    }
 
	copy(vecINT.begin(),vecINT.end(),front_inserter(ivec));
 
    for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
        cout<<*iter<<" ";
    cout<<endl;
 
    system("pause");
    return 0;
}
代码如上: 输出4 3 2 1 0
ForestDB 2013-03-15
  • 打赏
  • 举报
回复
请上代码。。
zhaoomeng 2013-03-15
  • 打赏
  • 举报
回复
引用 2 楼 ForestDB 的回复:
LS的,inserter不是在尾部插入数据,back_inserter才是。 copy(vecINT.begin(),vecINT.end(),inserter(ivec,ivec.begin())); 这句的话意思是,把vecINT从头到尾,一个整体,插如ivec的第0个元素之前,所以自然还保持着0 1 2 3 4的顺序。 做为对比,请与下面的程序对比。 ……
大神,容我再冒昧的问一个问题: 假如我把inserter(ivec,ivec.begin())替换成front_inserter(ivec),程序将输出4 3 2 1 0.就本题而言,这是不是说明inserter是把0 1 2 3 4作为一个整体插入,而front_inserter是将5个数字逐个插入,共插入5次呢?
ForestDB 2013-03-14
  • 打赏
  • 举报
回复
另外如下程序可以产生4 3 2 1 0,请对比

# include <iostream>
# include <vector>

using namespace std;

int main()
{
    vector<int> v1, v2;
    for (int i = 0; i < 5; i++)
        v1.push_back(i);

    for (vector<int>::iterator it = v1.begin(); it != v1.end(); ++it)
        *inserter(v2, v2.begin()) = *it;

    for (vector<int>::iterator it = v2.begin(); it != v2.end(); ++it)
        cout << *it << endl;

    return 0;
}
而这个iterator是会失效的,请和下面对比

# include <iostream>
# include <vector>

using namespace std;

int main()
{
    vector<int> v1, v2;
    for (int i = 0; i < 5; i++)
        v1.push_back(i);

    insert_iterator<vector<int> > foo = inserter(v2, v2.begin());
    for (vector<int>::iterator it = v1.begin(); it != v1.end(); ++it)
        *foo = *it;

    for (vector<int>::iterator it = v2.begin(); it != v2.end(); ++it)
        cout << *it << endl;

    return 0;
}
ForestDB 2013-03-14
  • 打赏
  • 举报
回复
LS的,inserter不是在尾部插入数据,back_inserter才是。 copy(vecINT.begin(),vecINT.end(),inserter(ivec,ivec.begin())); 这句的话意思是,把vecINT从头到尾,一个整体,插如ivec的第0个元素之前,所以自然还保持着0 1 2 3 4的顺序。 做为对比,请与下面的程序对比。

# include <iostream>
# include <vector>

using namespace std;

int main()
{
    vector<int> v1, v2;
    for (int i = 0; i < 5; i++)
        v1.push_back(i);
    for (int i = 0; i < 5; i++)
        v2.push_back(i);

    copy(v1.begin(), v1.end(), inserter(v2, v2.begin() + 1));

    for (vector<int>::iterator it = v2.begin(); it != v2.end(); ++it)
        cout << *it << endl;

    return 0;
}
注意,这里的v2不为空,且将v1插入v2的第一个元素之后。
漫步者、 2013-03-14
  • 打赏
  • 举报
回复
inserter在尾部插入数据,vector你看做数组,你copy只是把vector中的数据复制到另一个地方放,数据顺序是跟以前的顺序一致。

64,632

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧