也许这是重复的,但是我没有找到任何搜索内容:erase(value)
对std::multiset
所有具有找到的值的元素调用时,将被删除。我能想到的唯一解决方案是:
std::multiset<int>::iterator hit(mySet.find(5));
if (hit!= mySet.end()) mySet.erase(hit);
可以,但是我认为可能会更好。有任何想法吗 ?
也许这是重复的,但是我没有找到任何搜索内容:erase(value)
对std::multiset
所有具有找到的值的元素调用时,将被删除。我能想到的唯一解决方案是:
std::multiset<int>::iterator hit(mySet.find(5));
if (hit!= mySet.end()) mySet.erase(hit);
可以,但是我认为可能会更好。有任何想法吗 ?
multimap
:是否可以保证find
返回哪些元素?(插入顺序?即使在这样的删除之后?是否依赖于实现?)
Answers:
auto itr = my_multiset.find(value);
if(itr!=my_multiset.end()){
my_multiset.erase(itr);
}
我可以想象有一种更干净的方法可以达到目的。但这可以完成工作。
我会尝试以下。
首先调用equal_range()
以查找等于该键的元素范围。
如果返回的范围是非空的,则erase()
一个元素范围(即,erase()
它需要两个迭代器),其中:
第一个参数是返回范围内第二个元素的迭代器(即.first
返回的过去一个),并且
第二个参数是返回的范围对迭代器的范围.second
。
阅读templatetypedef的(谢谢!)评论后进行编辑:
如果应该删除一个(而不是全部)重复项:如果所返回的equal_range()
对中至少有两个元素,则erase()
通过将返回对中的.first传递给的单个迭代器版本来实现第一个元素erase()
:
伪代码:
pair<iterator, iterator> pit = mymultiset.equal_range( key );
if( distance( pit.first, pit.second ) >= 2 ) {
mymultiset.erase( pit.first );
}
我们可以做这样的事情:
multiset<int>::iterator it, it1;
it = myset.find(value);
it1 = it;
it1++;
myset.erase (it, it1);