vector删,erase和remove难怪--【STL】

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" >

有一个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

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

时间: 2024-10-03 09:14:01

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

map 和 vector 的erase函数说明

1. map的erase函数使用 这里首先要注意,C++针对map的erase函数有不同的函数原型,这往往是出现问题的关键所在.根据参考文献1: 在C++98中: ? 1 2 3 4 5 (1) void erase (iterator position); (2)size_type erase (const key_type& k); (3)void erase (iterator first, iterator last); 在C++11中: ? 1 2 3 4 5 (1)iterator 

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

vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase(   iterator _Where); iterator erase(   iterator _First,   iterator _Last); 如果是删除指定位置的元素时: 返回值是一个迭代器,指向删除元素下一个元素; 如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素; 看下面的程序,目的

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

2878: [Noi2012]迷失乐园 Time Limit: 10 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 319  Solved: 223 [Submit][Status] Description 放假了,小Z认为呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现能够将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环(即m仅仅可能等于n或者n-1). 小Z如今所在的大门也正好

vector中erase使用

vector中erase用法注意事项 - daofengdeba - 博客频道 - CSDN.NEThttp://blog.csdn.net/daofengdeba/article/details/7865229 for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); ){     if( *iter == 3)          iter = veci.erase(iter);      else            i

BZOJ 2878([Noi2012]迷失游乐园-树形DP+环加外向树+期望DP+vector的erase)

2878: [Noi2012]迷失游乐园 Time Limit: 10 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 319  Solved: 223 [Submit][Status] Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环(即m只可能等于n或者n-1).小Z现在所在的大门也正好是

vector中erase用法注意事项

以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错.今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.end()是变化的,因此就引入了错误的可能性. erase的函数原型有两种形式: iterator erase(iterator position); iterator erase(iterator first, iterator last); vector<int> veci;veci.push_

实习小白::(转) vector中erase用法注意事项

以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错.今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.end()是变化的,因此就引入了错误的可能性. erase的函数原型有两种形式: iterator erase(iterator position); iterator erase(iterator first, iterator last); vector<int> veci; veci.push

Vector::insert remove

首先看看vector不同于数组的一个地方:可以根据数据的多少扩容: 至于这里为什么要是扩充一倍,因为扩容函数执行也需要时间开销,当以增加一倍扩容时调用扩容的概率和容量的匹配要更好: template <typename T> void Vector<T>::expand() { //向量空间不足时扩容 if (_size < _capacity) return; //尚未满员时,不必扩容 if (_capacity < DEFAULT_CAPACITY) _capaci

Leetcode 27 Remove Element STL

和remove zero类似的方法完成该题 1 class Solution { 2 public: 3 int removeElement(vector<int>& nums, int val) { 4 vector<int>::size_type j = 0; 5 for(vector<int>::size_type i = 0; i < nums.size(); ++i){ 6 if(nums[i] != val) nums[j++] = nums[