c++ iterator 在迭代时push_back报错.
怪我咯
怪我咯 2017-04-17 12:06:15
[C++讨论组]
#include <vector>
#include <stdio.h>
#include <iostream>

using namespace std;
int main(){
        vector<int > v;
        auto iter = v.begin();
        vector<int>::iterator iter2=v.begin();
        v.push_back(4);
        cout<<"int0  "<<v[0]<<endl;
        cout<<"iter2"<<*iter2<<endl; //到这里就报错.为什么?
        cout<<"int"<<*iter<<endl;
        return 0;
}

g++ iterTest.cpp -std=c++11 -o iterTest

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(3)
PHP中文网

一般情况下,迭代过程中不允许修改数据源,如果数据源变化,必须重新迭代

PHP中文网
#include <vector>
#include <stdio.h>
#include <iostream>
using namespace std;

int main(){
        vector<int> v;
        v.push_back(4);
        vector<int>::iterator iter2=v.begin();
        auto iter = v.begin();
        cout<<"int0  "<<v[0]<<endl;
        cout<<"iter2"<<*iter2<<endl; //到这里就报错.为什么?
        cout<<"int"<<*iter<<endl;
        return 0;
}

这样就好了。

因为vector是动态增长的容器,当创建一个容器v,此时里面的元素为空,并且capacity容量也为0,此时执行begin()返回的迭代器与end()返回的相同。接着向里面添加元素时,标准库会自动为其新分配一段可以容纳该元素的内存空间,并将该元素存储进去,之前的迭代器就失效了。所以解引用时,该迭代器所指的位置并没有元素,报错。

高洛峰
int main(){
        vector<int > v;
        v.push_back(4);
        vector<int>::iterator iter2=v.begin();
        cout<<"iter2"<<*iter2<<endl;
        return 0;
}

代码如上调整,因为v.begin()指向的是vector的第一个元素,而你vector<int> v初始化的时候里面并没有插入任何数值,vector为空,所以你运行时出错,你必须插入至少一个元素后,再用v.begin()去实例化iterator的值,才能保证指向的迭代器是正确的迭代器

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号