3.16 multiset容器erase函数的误用
代码示例
- int main(){
- multiset <int> c1;
- c1.insert(3);
- c1.insert(2);
- c1.insert(3);
- c1.insert(3);
- c1.insert(5);
- int x=3;
- c1.erase(x);//remove one element with value 3
- for(multiset <int>::iterator it = c1.begin(); it != c1.end(); it++)
- {
- cout << *it << endl;
- }
- return 0;
- }
现象&后果
代码期望删除一个值为3的元素,但实际运行结果显示删除了所有值为3的元素。
Bug分析
multiset带一个参数的erase函数原型有两种。一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数;另外一种是传递一个指向某个元素的iterator,这时候删除的就是这个对应的元素,无返回值。用户需要根据自己的应用场景,正确调用对应的原型。例子代码中本意是想删除一个元素,但实际上是删除了所有值为3的元素,不符合预期。
正确代码
- int main(){
- multiset <int> c1;
- c1.insert(3);
- c1.insert(2);
- c1.insert(3);
- c1.insert(3);
- c1.insert(5);
- int x=3;
- multiset <int>::iterator pos = c1.find(x);
- c1.erase(pos);//remove one element with value 3
- for(multiset <int>::iterator it = c1.begin(); it != c1.end(); it++)
- {
- cout << *it << endl;
- }
- return 0;
- }
编程建议
在使用multiset的时候,需要注意mutilset与普通set容器的主要区别,即multiset允许元素重复,set不允许元素重复。这会给一些操作带来不同的影响。