C++ primer 学习笔记之容器insert
今天在做练习9.22时,始终出现segments fault。最后才发现原来是自己对“容器insert之后迭代器会失效”的理解不够透彻。
题目如下:
假定iv是一个int的vector,下面的程序存在什么错误?你将如何修改?
auto iter = iv.begin();
auto mid = iv.begin() + iv.size() / ;
while(iter != mid){
if(*iter == some_val)
iv.insert(iter, * some_val);
}
我起初编写的代码如下:
/*************************************************************************
> File Name: 9.22.cpp
> Author: wanchouchou
> Mail: 200802376@qq.com
> Created Time: 2014年11月02日 星期日 16时34分20秒
************************************************************************/ #include<iostream>
#include<vector>
using namespace std; int main(){
vector<int> vint = {,,,,,,,};
const int val = ;
auto viBegin = vint.begin();
/*这里需要注意,如果vint.size小于等于1的话,viMid = viBegin 那么就不会进入while循环,所以我们应当单独考虑这种情况*/
auto viMid = vint.begin() + vint.size()/;
if(vint.empty()){
cout << "This vector is empty!" << endl;
return ;
}
if(vint.size() == ){
if(*viBegin == val){
vint.insert(viBegin, * val);
}
goto print;
} while(viBegin != viMid){
if(*viBegin == val){
vint.insert(viBegin, * val); }
++viBegin;
} print:
auto viEnd = vint.end();
viBegin = vint.begin();
while(viBegin != viEnd){
cout << *viBegin << ", ";
++viBegin;
} cout << endl; }
运行的时候出现 segmentation faulted.
从逻辑上来讲,应该是没问题啊,那为什么又会出错呢?原来我忘记了对容器进行插入操作的重要影响“除了end之外,所有的迭代器都会失效!!!”。当完成第一次插入之后,此时的viBegin和viMid已经失效了,那么之后对其的所有操作都是非法的。所以我们必须在每一次插入操作之后对两个迭代器重新赋值。鉴于对viMid的赋值比较麻烦,所以采用另外的方式记录当前迭代器是否到达容器的中点,代码如下:
/*************************************************************************
> File Name: 9.22.cpp
> Author: wanchouchou
> Mail: 200802376@qq.com
> Created Time: 2014年11月02日 星期日 16时34分20秒
************************************************************************/ #include<iostream>
#include<vector>
using namespace std; int main(){
vector<int> vint = {,,,,,,};
const int val = ;
auto viBegin = vint.begin();
/*这里需要注意,如果vint.size小于等于1的话,viMid = viBegin 那么就不会进入while循环,所以我们应当单独考虑这种情况*/
auto mid = vint.size() / ;
if(vint.empty()){
cout << "This vector is empty!" << endl;
return ;
}
if(vint.size() == ){
if(*viBegin == val){
vint.insert(viBegin, * val);
}
goto print;
} while(distance(viBegin, vint.end()) > mid){
if(*viBegin == val){
viBegin = vint.insert(viBegin, * val);
++viBegin;
}
++viBegin;
} print:
auto viEnd = vint.end();
viBegin = vint.begin();
while(viBegin != viEnd){
cout << *viBegin << ", ";
++viBegin;
} cout << endl; }
运行效果如下:
wanchouchou@wanchouchou-virtual-machine:~/c++/.*$ ./9.22
, , , , , , , , , , ,
C++ primer 学习笔记之容器insert的更多相关文章
- C++ Primer学习笔记(三) C++中函数是一种类型!!!
C++中函数是一种类型!C++中函数是一种类型!C++中函数是一种类型! 函数名就是变量!函数名就是变量!函数名就是变量! (---20160618最新消息,函数名不是变量名...囧) (---201 ...
- C++ Primer学习笔记(二)
题外话:一工作起来就没有大段的时间学习了,如何充分利用碎片时间是个好问题. 接 C++ Primer学习笔记(一) 27.与 vector 类型相比,数组的显著缺陷在于:数组的长度是固定的,无法 ...
- Docker学习笔记 - Docker容器内部署redis
Docker学习笔记(2-4)Docker应用实验-redist server 和client的安装使用 一.获取redis容器(含客户端和服务端) 二.创建服务端容器 1.在终端A中运行redis- ...
- Docker学习笔记 - Docker容器之间的连接
学习目标: 容器之间可以相互连接访问:: --link redis:redisAlias 准备工作 FROM ubuntu:14.04 RUN apt-get install -y ping RUN ...
- C++ Primer 学习笔记_38_STL实践与分析(12)--集成的应用程序容器:文本查询程序
STL实践与分析 --容器的综合应用:文本查询程序 引言: 本章中最重点的实例.由于不须要用到multiset与multimap的内容.于是将这一小节提到了前面.通过这个实例程序,大师分析问题的智慧, ...
- C++ Primer 学习笔记_46_STL实践与分析(20)--容器特有的算法
STL实践与分析 --容器特有的算法 与其它顺序容器所支持的操作相比,标准库为list容器定义了更精细的操作集合,使它不必仅仅依赖于泛型操作.当中非常大的一个原因就是list容器不是依照内存中的顺序进 ...
- C++ Primer 学习笔记_33_STL实践与分析(7) --容器适配器
STL实践与分析 --容器适配器 引: 除了顺序容器.标准库还提供了三种顺序容器适配器:queue,priority_queue和stack.适配器是标准库中的概念.包含容器适配器,迭代器适配器和函数 ...
- C++ Primer 学习笔记_34_STL实践与分析(8) --引言、pair类型、关联容器
STL实践与分析 --引言.pair类型.关联容器 引言: 关联容器与顺序容器的本质差别在于:关联容器通过键[key]来存储和读取元素,而顺序容器则通过元素在容器中的位置顺序的存取元素. ma ...
- C++ Primer 学习笔记_35_STL实践与分析(9)--map种类(在)
STL实践与分析 --map类型(上) 引: map是键-值对的集合. map类型通常能够理解为关联数组:能够通过使用键作为下标来获取一个值,正如内置数组类型一样:而关联的本质在于元素的值与某个特定的 ...
随机推荐
- Rsync备份服务部署
1 Rsync服务器架构规划 在搭建服务之前需要做以下规划设计,其中包括:主机规划表.主机IP地址规划表.主机架构图.主机hosts解析以及linux主机基础优化等 1.1 主机规划表 服务器说明 数 ...
- 用ajax获取淘宝关键字接口
可定需要查看淘宝界面的结构,按F12查看网页,此时先清除一下网页中的数据,让Network制空,随后在输入框中输入新的内容,比如钱包,数据中会出现新的数据.点击及查看蓝色方框中的内容 点击之后,你可以 ...
- python__系统 : 异步实现以及GIL
创建进程的方式中有个 callback ,也就是回调. 看代码: from multiprocessing import Pool import time import os def test(): ...
- Python全栈day 05
Python全栈day 05 一.数据类型补充 1. int py2和py3的2种区别 py2有int和long,int的取值范围为-2^31~2^31-1,超出范围自动转为long,长整型. py2 ...
- dategrip破解
https://blog.csdn.net/weixin_39428938/article/details/81078806
- Sqoop 工具使用
Sqoop 是什么及安装 Hadoop sqoop Apache sqoop (SQL to Hadoop) Sqoop is a tool designed to transfer data bet ...
- android Intent onNewIntent 什么时候调用
1.activity A 的lanch model 为singleTop 此刻,A在activity 栈顶,那么就会调用A 的onNewIntent 如果A不在栈顶,则不会调用. 2.activity ...
- MySQL之查询性能优化(三)
MySQL查询优化器的局限性 MySQL的万能“嵌套循环”并不是对每种查询都是最优的.不过还好,MySQL查询优化只对少部分查询不适用,而且我们往往可以通过改写查询让MySQL高效地完成工作. 关联子 ...
- USACO Section2.1 Hamming Codes 解题报告 【icedream61】
hamming解题报告----------------------------------------------------------------------------------------- ...
- ptmalloc,tcmalloc和jemalloc内存分配策略研究 ? I'm OWen..
转摘于http://www.360doc.com/content/13/0915/09/8363527_314549949.shtml 最近看了glibc的ptmaoolc,Goolge的tcmall ...