C++ STL中删除set或multiset中的元素

C++ STL中删除set或multiset中的元素

诸如 set、 multiset、 map 和 multimap 等关联容器都提供了成员函数 erase( ),它让您能够根据键删除值:
setObject.erase (key);
erase()函数的另一个版本接受一个迭代器作为参数,并删除该迭代器指向的元素:
setObject.erase (element);
通过使用迭代器指定的边界,可将指定范围内的所有元素都从 set 或 multiset 中删除:
setObject.erase (iLowerBound, iUpperBound);

set/multiset的删除

set.clear(); //清除所有元素
set.erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
set.erase(beg,end); //删除区间[beg,end)的所有元素,返回下一个元素的迭代器。
set.erase(elem); //删除容器中值为elem的元素。
删除区间内的某个或某些元素
setInt是用set声明的容器,假设它内部现已包含按顺序的1, 2, 3, 4, 5, 6元素。

set::iterator itBegin=setInt.begin();
++ itBegin;
set::iterator itEnd=setInt.begin();
++ itEnd;
++ itEnd;
++ itEnd;
setInt.erase(itBegin,itEnd);

//set.erase(beg,end); //删除区间 [beg,end) 的所有元素
//此时容器setInt包含按顺序的1, 4, 5, 6四个元素。(高中数学学过吧!!!)

删除容器中第一个元素

setInt.erase(setInt.begin()); //4, 5, 6
1
删除容器中值为5的元素

setInt.erase(5); //4, 6
1
删除setInt的所有元素

setInt.clear(); //容器为空

程序清单 19.4 演示了如何使用 erase( )来删除 mset 或 multiset 中的元素

0: #include <set>
1: #include <iostream>
2: using namespace std;
3:
4: template <typename T>
5: void DisplayContents (const T& Input)
6: {
7: for (auto element = Input.cbegin();
8: element != Input.cend ();
9: ++ element )
10: cout << *element << ' ';
11:
12: cout << endl;
13: }
14:
15: typedef multiset <int> MSETINT;
16:
17: int main ()
18: {
19: MSETINT msetInts{ 43, 78, 78, -1, 124 };
20:
21: cout << "multiset contains " << msetInts.size () << " elements: ";
22: DisplayContents(msetInts);
23:
24: cout << "Enter a number to erase from the set: ";
25: int input = 0;
26: cin >> input;
27:
28: cout << "Erasing " << msetInts.count (input);
29: cout << " instances of value " << input << endl;
30:
31: msetInts.erase (input);
32:
33: cout << "multiset now contains " << msetInts.size () << " elements: ";
34: DisplayContents(msetInts);
35:
36: return 0;
37: }

输出:
multiset contains 5 elements: -1 43 78 78 124
Enter a number to erase from the set: 78
Erasing 2 instances of value 78
multiset now contains 3 elements: -1 43 124
分析:
注意到第 15 行使用了 typedef。第 28 行使用了 count( )来确定有多少个元素包含特定的值。实际的
删除操作是在第 31 行执行的,它删除与用户输入的数字匹配的所有元素。

函数 erase( )被重载了。可像程序清单 19.4 那样将一个值传递给 erase(),这将删除所有包
含指定值的元素。还可将迭代器(如 find()返回的迭代器)传递给 erase( ),这将删除单
个元素,如下所示:
MSETINT::iterator elementFound = msetInts.find
(numberToErase);
if (elementFound != msetInts.end ())
msetInts.erase (elementFound);
else
cout << "Element not found!" << endl;
同样, erase( )还可用于从 multiset 中删除指定范围内的元素:
MSETINT::iterator elementFound = msetInts.find
(valueToErase);
if (elementFound != msetInts.end ())
msetInts.erase (msetInts.begin (), elementFound);
上述代码删除从开头到值为 valueToErease 的所有元素(不包含 valueToErease)。要清空
set 和 multiset 的内容,可使用其成员函数 clear( )。
  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值