vector使用容器。通常只是一个简单的遍历查找,其他操作已执行,这不是,今天,稍有不慎。

erase方法的操作是将此时的节点删除,然后指向被删除节点的下一个:

如对数据1 6 6 4 7;

#include <iostream>
#include <vector>
#include <algorithm> using namespace std; int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(6);
vec.push_back(6);
vec.push_back(4);
vec.push_back(7); vector<int>::iterator arr; //vec.erase(remove(vec.begin(), vec.end(), 6), vec.end());
for(arr = vec.begin(); arr != vec.end(); arr++)
{
if(6 == *arr)
{
vec.erase(arr);
//arr--;
}
} cout << "The size of vector is :" << vec.size() << endl;
for(arr = vec.begin(); arr != vec.end(); arr++)
{ cout << *arr << " ";
}
cout << endl; return 0;
}

进行如上操作的结果为:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGptMTk5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

有一个6未成功删除,因为每次循环后都将迭代器arr++,在成功删除之后节点后移了一位。实际上在删除进行时是后移了两位,故而在删除时:

for(arr = vec.begin(); arr != vec.end(); arr++)
{
if(6 == *arr)
{
vec.erase(arr);
arr--;
}
}

有了arr--操作,就可抵消删除时的自己主动后移。从而成功进行:

当然,erase还有另外一个方法,就是删除两个节点之间的所有元素。这时依靠remove操作将等于删除值的节点所有移到容器末尾。进行删除;

将上述for循环删除的凝视,将其上一行的vec.erase(remove(vec.begin(), vec.end(), 6), vec.end());凝视取消就可以实现;

#include <iostream>
#include <vector>
#include <algorithm> using namespace std; int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(6);
vec.push_back(6);
vec.push_back(4);
vec.push_back(7); vector<int>::iterator arr; vec.erase(remove(vec.begin(), vec.end(), 6), vec.end()); //
/*for(arr = vec.begin(); arr != vec.end(); arr++)
{
if(6 == *arr)
{
vec.erase(arr);
arr--;
}
}*/ cout << "The size of vector is :" << vec.size() << endl;
for(arr = vec.begin(); arr != vec.end(); arr++)
{ cout << *arr << " ";
}
cout << endl; return 0;
}

O(∩_∩)O

版权声明:本文博客原创文章,博客,未经同意,不得转载。

vector删,erase和remove难怪--【STL】的更多相关文章

  1. C++——list中erase和remove的区别

    1.之前在做相关的操作的时候,涉及到清除list相关的元素,因此会用到erase和remove,那么二者有什么区别呢? 从官方文档中,我们可以获取以下信息 erase : 说明:Removes fro ...

  2. map 和 vector 的erase函数说明

    1. map的erase函数使用 这里首先要注意,C++针对map的erase函数有不同的函数原型,这往往是出现问题的关键所在.根据参考文献1: 在C++98中: (1) void erase (it ...

  3. BZOJ 2878([Noi2012]-失落的游乐园树DP+出站年轮加+后市展望DP+vector的erase)

    2878: [Noi2012]迷失乐园 Time Limit: 10 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 319  Solved:  ...

  4. 【转】vector中erase()的使用注意事项

    vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase(   iterator _Whe ...

  5. 关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论

    关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论 1.前言: 最近在做某一个题时,用到了vector的删除操作,利用的是erase()函数删除符合 ...

  6. vector元素的删除 remove的使用 unique的使用

    在vector删除指定元素可用以下语句 : v.erase(remove(v.begin(), v.end(), element), installed.end()); 可将vector中所有值为el ...

  7. vector中erase用法注意事项

    以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错.今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.e ...

  8. vector的erase的用法

    vector<string>::iterator it = v.erase(v.begin() + 3, v.begin() + 6); 可以直接从begin进行加减,比如我们要移除第3个 ...

  9. Leetcode 27 Remove Element STL

    和remove zero类似的方法完成该题 class Solution { public: int removeElement(vector<int>& nums, int va ...

随机推荐

  1. Java反射学习总结二(用反射调用对象的私有属性和方法)

    大家都知道正常的调用是不可以访问对象的private修饰的属性和方法的,这也是Java的封装性原则. 但是有没有方法可以强制去访问对象的private修饰的属性和方法呢?那就是用反射!(这个可能在面试 ...

  2. 2014年武汉的IT行情好像不太好

    本周,加入武汉一起好工作一周了,也就是说本次找工作彻底结束了. 总的来说,求职行情不太行,双方都匹配的工作好少呀. 1. 武汉财富基石,过了一面,第二面没有去.   钱太少,4K多,跳楼价. 2.武汉 ...

  3. 如何调试Javascript代码

    转自原文如何调试Javascript代码 目前,常用的浏览器IE.Chrome.Firefox都有相应的脚本调试功能.作为我们.NET 阵营,学会如何在IE中调试JS就足够了,在掌握了IE中的调试方法 ...

  4. 用python的库监听鼠标程序测试,有程序,有现象

    程序如下: # -*- coding: utf-8 -*- import pythoncom, pyHook  def OnMouseEvent(event):   print 'MessageNam ...

  5. 【48.47%】【POJ 2524】Ubiquitous Religions

    Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 32364 Accepted: 15685 Description There a ...

  6. 解决maven项目找不到maven依赖的解决办法

    不同的IDE对应的.classpath中的maven声明也不一样,这样就会导致项目找不到maven依赖. 即Java Build Path--->Libraries中找不到Maven Depen ...

  7. Windows7-32位系统下R语言链接mySQL数据库步骤

    安装R和MySQL在此就不再多说了.网上有非常多教程能够找到.以下直接进入到odbc的安装流程. 1.下载安装mysql-connector-odbc-5.x.x-win32.msi 下载地址:htt ...

  8. 我的嵌入式Qt开发第一课——基于BBB和hmc5843三轴电子罗盘

    几次想照着课本系统地学习Qt,但我发现还是有详细问题驱动时学习比較快. 于是我给自己设定了这个任务: 读取HMC5843的三轴磁场强度值,计算出角度,并把角度用直观形式显示在图形界面上. 这里面涉及到 ...

  9. ServerSocketChannel API用法

    java.nio.channels 类 ServerSocketChannel java.lang.Object java.nio.channels.spi.AbstractInterruptible ...

  10. MySQL的表空间管理

    表空间: MySQL没有真正意义上的表空间管理. MySQL的Innodb包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间. 一般来说,当数据量很小的时候建议使用共享表空间的管理方式. ...