C++中如何在顺序容器中删除符合特定条件的元素
以前很少做删除操作,vector一直当成数组用,而实际追求效率时又经常舍弃vector选用C风格数组。看《C++ Primer》到顺序容器删除这节时试着实现课后习题结果一动手我就出错了。
习题是将数组int ia[]拷贝到std::vector<int>中,并删除偶数元素。
先给出我的错误代码
int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 };
vector<int> v(begin(ia), end(ia));
for (auto iter = v.begin(); iter != v.end(); ++iter)
{
if (!(*iter % 2))
v.erase(iter);
}
抛出异常:vector iterator not incrementable,迭代器不可递增。
原因很简单,因为迭代器都被删除了……所以要用到erase函数的返回值来赋给iter,如果删除成功则把那句v.erase(iter);改成iter = v.erase(iter);否则就直接++iter。
于是for循环第三部分没什么用,干脆改成while循环,发现书上都有几乎一模一样的示例(好吧,毕竟书太厚,以为很熟悉的地方就一目十行了=。=)
更改后如下
int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 };
vector<int> v(begin(ia), end(ia));
auto iter = v.begin();
while (iter != v.end())
{
if (*iter % 2)
++iter;
else
iter = v.erase(iter);
}
这也体现了当年上数据结构时做课程作业马虎的错,当时实现基本数据结构时很多函数都没实现完整,其实数据结构学好了容器也会很容易上手,因为了解了大致流程。
不用容器,直接删除数组ia中的偶数,代码如下
const unsigned cLength = 11;
unsigned size = cLength; // 数组新的大小
int ia[cLength] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 };
int index = 0;
for (int n = 0; n < cLength; ++n) // n只代表访问次数
{
if (ia[index] % 2)
index++;
else // 元素为偶数
{
--size; // 数组大小减1
// 被删除元素后面的元素前移动
for (unsigned j = index; j < size; j++)
ia[j] = ia[j + 1];
// 元素下标不变
}
}
cout << "删除后数组大小: " << size << "\n新的数组元素如下:\n";
for (int i = 0; i < size; i++)
cout << ia[i] << " ";
cout << endl;

C++中如何在顺序容器中删除符合特定条件的元素的更多相关文章
- SqlSever基础 delete 删除符合特定条件的元素
y 镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.---------------------------------------- ...
- java的List中使用filter过滤出符合特定条件的元素List
在实际开发中,经常需要把一个列表中的元素,按照特定条件过滤出来,放到一个新的列表中.本文给出了几个例子,来描述解决这个问题的方法. 我们假设有一个书的List,需要找出其中id分别是3.6.8.9的书 ...
- cb09a_c++_顺序容器的操作2-在顺序容器中添加元素_插入数据
cb09a_c++_顺序容器的操作2在顺序容器中添加元素vector不能向前插入数据,list可以用insertc.push_back(t);c.push_front(t);c.insert(p,t) ...
- 【Spring注解驱动开发】在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean
写在前面 在前面的文章中,我们学习了如何使用@Import注解向Spring容器中导入bean,可以使用@Import注解快速向容器中导入bean,小伙伴们可以参见<[Spring注解驱动开发] ...
- C++——STL中三种顺序容器的简要差别
C++ STL 提供了3个顺序容器 :vector, deque, list Vector动态数组.支持高速訪问:list双向链表,支持高速插入和删除. vector 中的元素是顺序存放的.所以随机訪 ...
- java web中如何获取spring容器中定义的bean----WebApplicationContext的使用
本文简单编写一个servlet来获取spring容器中管理的<bean id="dateBean" class="java.util.Date" sin ...
- 7 -- Spring的基本用法 -- 5... Spring容器中的Bean;容器中Bean的作用域;配置依赖;
7.5 Spring容器中的Bean 7.5.1 Bean的基本定义和Bean别名 <beans.../>元素是Spring配置文件的根元素,该元素可以指定如下属性: default-la ...
- JSP页面中如何注入Spring容器中的bean
第一步在JSP页面中导入下面的包: <%@page import="org.springframework.web.context.support.WebApplicationCont ...
- linux下如何映射宿主机中的文件到容器中?
答:在启动容器时使用-v指定宿主机目录和要映射到的容器内部目录,语法如下: docker run -it -v <host_dir>:<container_dir> <c ...
随机推荐
- Java复习10.Servlet编程
Java复习10. Servlet编程知识 20131008 前言: 之前在大三下的时候,学习了一个月的JSP和Servlet知识,但是没有什么项目经验,把JSP Web开发学习实录看了前面几张,后面 ...
- C#笔记 -- 协变、逆变
协变 理解:在泛型和委托中, 让使用某个泛型参数A的类型可以用一个使用由A派生的泛型参数B的类型实例化,(小=> 大)如 // IEnumerable<Animal> 与 Lis ...
- ffmpeg 命令小记
指定格式转码 ffmpeg -i 1.mp4 -c:v libx264 -c:a aac -y 1.flv 等时长转为m3u8格式 ffmpeg -i 1.avi -c:v libx264 -c:a ...
- 使用CGLib完成代理模式遇到的错误
错误堆栈信息: Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/Type ...
- 2018.11.15 RF antenna impedance-matching
We have studied the impedance-matching of RF transmission line between the antenna and the RX / TX m ...
- 慕课网-Linux达人养成计划学习笔记
mkdir -p [目录]创建目录-p 递归创建ls 查看当前目录下的文件和目录等其他文件 cd [目录]命令英文愿意:change directory切换所在目录简化操作cd ~ 进入当前用户的家目 ...
- (一) ffmpeg filter学习-使用流程
FFMPEG中有一个类库:libavfilter.该类库提供了各种视音频过滤器.之前一直没有怎么使用过这个类库,最近看了一下它的使用说明,发现还是很强大的,有很多现成的filter供使用,完成视频的处 ...
- libcurl 错误码总结
下载出现这种错误(Requested range was not delivered by the server ),说明是重复下载,删掉本地的再下载就不会出现了
- http协议知识整理
HTTP 协议 作为web开发人员,了解一些http协议的知识很有必要.本文简单介绍了HTTP协议的知识,若有错误的地方,望大家指正. 1.HTTP协议是什么? http协议是一个应用层的协议.规定了 ...
- Unity Obstacle分析
NavMeshObstacle Normal 通过设置半径和高度来设定障碍物,配合NavMesh使用. 优点: 简单易用,效率高 动态生成 缺点: 可能会被主角穿过,但目前没发现 形状固定为圆柱 Na ...