std::set erase() 方法
- 自 C++23 起
- 自 C++11 起
- 直到 C++11
// (1) Non const version only
iterator erase( iterator pos );
iterator erase( const_iterator pos );
// (2) Non const version only
iterator erase( const_iterator first, const_iterator last );
// (3) Non const version only
size_type erase( const Key& key );
// (4) Non const version only
template< class K >
size_type erase( K&& x );
// (1) Non const version only
iterator erase( iterator pos );
iterator erase( const_iterator pos );
// (2) Non const version only
iterator erase( const_iterator first, const_iterator last );
// (3) Non const version only
size_type erase( const Key& key );
// (1) Non const version only
void erase( iterator pos );
// (2) Non const version only
void erase( iterator first, iterator last );
// (3) Non const version only
size_type erase( const Key& key );
- (1) 移除
pos
位置的元素。- 自 C++11 起
如果iterator
和const_iterator
是同一类型,则只提供一个重载。 - (2) 移除范围 [ first; last ) 内的元素,该范围必须是
*this
中的有效范围。 - (3) 移除(如果存在)键等于
key
的元素。 - (4) 移除(如果存在)键与值
x
比较等价的元素。此重载仅当限定IDCompare::is_transparent
有效且表示一个类型时才参与重载决议 - O(size())。并且iterator
和const_iterator
都不能从K
隐式转换。它允许在不构造Key
实例的情况下调用此函数。
失效
被擦除元素的引用和迭代器失效。
其他迭代器和引用不受影响。
有效迭代器
迭代器 pos 必须是有效的且可解引用的。因此 end()
迭代器(它是有效的 - O(size()))。
参数
pos
- 指向要移除元素的迭代器first
- O(size())。key
- 要移除元素的键值x
- 可以与键透明比较的任何类型的值,表示要移除的元素
返回值
- (1-2) - 最后一个被移除元素之后的迭代器。
- (3-4) - 移除的元素数量(0 或 1)。
复杂度
- (1) 均摊常量 - O(1)。
- (2) log size() + std::distance(first, last)
- (3) log size() + count(key)
- (4) log size() + count(x)
异常
- (1-2) (无)
- (3-4)
Hash
和KeyEqual
对象抛出的任何异常。
备注
功能测试宏:__cpp_lib_associative_heterogeneous_erasure
(用于重载 (4))。
示例
Main.cpp
#include <set>
#include <iostream>
int main()
{
std::set<int> c = { 1, 2, 3, 4, 1, 2, 3, 4 };
auto print = [&c] {
std::cout << "c = { ";
for(int n : c)
std::cout << n << ' ';
std::cout << "}\n";
};
print();
std::cout << "Erase all odd numbers:\n";
for(auto it = c.begin(); it != c.end(); ) {
if(*it % 2 != 0)
it = c.erase(it);
else
++it;
}
print();
std::cout << "Erase 1, erased count: " << c.erase(1) << '\n';
std::cout << "Erase 2, erased count: " << c.erase(2) << '\n';
std::cout << "Erase 2, erased count: " << c.erase(2) << '\n';
print();
}
可能输出
c = { 1 2 3 4 }
Erase all odd numbers:
c = { 2 4 }
Erase 1, erased count: 0
Erase 2, erased count: 1
Erase 2, erased count: 0
c = { 4 }