vector中的删除,earse和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;
}

进行如上操作的结果为:

有一个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-07-30 10:56:23

vector中的删除,earse和remove的小疑惑--【STL】的相关文章

C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法

C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法. C++ 中std::remove()并不删除元素,因为容器的size()没有变化,只是元素的替换. 1.std::vector::erase() 函数原型:iterator erase (iterator position); //删除指定元素 iterator erase (iterator first, iterator last); //删除指定范围内的元素 返回值:指向删除元素(或

vector中删除的注意事项

erase的函数原型有两种形式: iterator erase(iterator position); iterator erase(iterator first, iterator last); 例如有一个类A, class A { public:     int id;     A(void);     ~A(void); }; 定义vector<A*> vec for (int i=0; i<10; i++) {     A *p = new A();     p->id =

Iterator的remove方法可保证从源集合中安全地删除对象(转)

import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorTest{ public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("Test1"); list.add("Test2&qu

删除vector中的偶数元素,删除list中的奇数元素

#include<vector> #include<list> #include<iostream> using namespace std; int main() { vector<int> vec={0,1,1,2,3,5,8,21,55,89}; list<int> li={0,1,1,2,3,5,8,21,55,89}; auto ve=vec.begin(); auto it=li.begin(); while(ve!=vec.end(

删除vector中元素高效的方法

#include <iostream> #include <vector> using namespace std; int main() { std::vector<int> ve1; ve1.push_back(1); ve1.push_back(2); ve1.push_back(3); ve1.push_back(4); ve1.push_back(5); ve1.push_back(6); std::vector<int>::iterator it

vector中的元素删除

删除vector中的元素,最容易的方法就是使用vector的erase()函数. vector vec;for ( vector::iterator iter = vec.begin(); iter! = vec.end();){    if(某条件成立)        iter = vec.erase(iter);    else        iter ++;} 如果要清空vector中的元素,可以使用erase()循环删除,也可以用clear()函数. for ( vector::iter

java.util.vector中的vector的详细用法

ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.util.*; /** * 演示Vector的使用.包括Vector的创建.向Vector中添加元素.从Vector中删除元素. * 统计Vector中元素的个数和遍历Vector中的元素. */ public class VectorDemo{ public static void main(String[] args){ //Vector的创建 //使用Vector

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