前面一章节主要是针对容器的增加,可以明显看到关联容器和顺序容器的特点,下面主要介绍两类容器的删除和查找的区别

目录


1、vector的元素删除

vector的删除主要有三种方法:erase、pop_back和 remove(algortihm)

  • iterator erase(iterator first,iterator second) 删除区间[first,last)之间的元素

    • iterator erase(iterator position) 删除当前位置的元素,但注意删除后、position 会自动++, 返回的iterator指向新的容器中(最后一个删除元素)的下一个位置。
  • void clear() 清空所有元素

  • void pop_back() 删除最后一个元素

  • iterator remove(iterator first,iterator second,value)

返回最后一个元素的iterator,容器后面的依然保留了。

经常使用方法:

iv.erase(remove(iv.begin(), ib.end(), remove_value), iv.end());

算法描述:查找的得到第一个元素的位置,然后从此位置开始遍历容器,将后面的元素依次前移,跳过和value相同值的元素.
也就是说,所有和value相同值的元素都会被覆盖,而其他的元素都会依次前移。
最后,remove返回”指向最后一个 ‘有用’ 元素的iterator”,
但是在remove算法过程中,并没有修改原容器的size,以及end()。

2、map的元素删除

map的删除

map::erase()

下面两种方法和vector的相同

  • iterator erase(iterator first,iterator second) 删除区间[first,last)之间的元素

  • iterator erase(iterator position)
    删除当前位置的元素,但注意删除后、position不会自动++,被删除元素的迭代器,在删除之后失效!这里是和vector的区别!

3、set的元素删除

  • (1) 移除set容器内元素值为value的所有元素,返回移除元素的个数

size_type erase(value)

  • (2) 移除pos位置上的元素,无返回值

void erase(iterator pos)

删除后pos不会自动++!这里是和vector的区别
不会自动++,被删除元素的迭代器,在删除之后失效!这里是和vector的区别!

  • (3) 移除迭代区间[first,last)内的所有元素,无返回值

void erase(iterator first, iterator last)

(4) 移除set容器内所有的元素

void clear()

小结

从上面来看,其实两类容器在删除的功能来说是很相似的,都主要删除指定的iterator和区间内的iterator。唯一不一样的是,因为两者在内存中的形式不一样,如果调用remove()方法以后,vector对应的iterator所指向的删除后的下一个位置。而后者这是指着失效的iterator.

代码

#include <iostream>
#include <algorithm>
using namespace std;
#include <map>
typedef pair<int,string> stuType;
void print(map<int,string> stu)
{
    auto ib = stu.begin();
    while(ib != stu.end())
    {
        cout << ib->first << " " << ib->second << endl;
        ib++;
    }
}
int main(int argc, char *argv[])
{
   map<int,string> mapstu;
    //1.方法1:pair
    pair<map<int,string>::iterator,bool> insert_pair = mapstu.insert(pair<int,string>(1,"LiLei"));
   //若插入成功insert_pair.second为true
    if(insert_pair.second) 
        cout <<" insert success!" << endl;
    mapstu.insert(stuType(2,"HanMeiMei"));

    //2.方法2:value_type
    mapstu.insert(map<int,string>::value_type(3,"xiaoming"));

    //3.方法3:数组形式
    mapstu[6] = "ZhaoYun";
    print(mapstu);

    //删除
    cout << "---before erase---\n";
    map<int,string>::iterator ib= mapstu.begin();
    for(;ib!= mapstu.end();ib++)
        cout << ib->first << " " << ib->second << endl;
    cout << "--------------\n";
    ib = mapstu.begin();
    mapstu.erase(ib);
    print(mapstu);
    return 0;
}
>>> insert success!
1 LiLei
2 HanMeiMei
3 xiaoming
6 ZhaoYun
---before erase-
1 LiLei
2 HanMeiMei
3 xiaoming
6 ZhaoYun
--------------
2 HanMeiMei
3 xiaoming
6 ZhaoYun

有个奇怪的现象
如果,在输出的时候,以数组的形式访问的话,那么对于不存在key的结点,那么会自动增加该结点到map中,value的值为空字符。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐