C++ set erase() 函数用于从集合容器中删除与给定键关联的单个元素或一系列元素 ([first, last))。因此,大小将因删除的元素数量而减少。
用法
void erase (iterator position); //until C++ 11
size_type erase (const value_type& val); //until C++ 11
void erase (iterator first, iterator last); //until C++ 11
iterator erase (const_iterator position); //since C++ 11
size_type erase (const value_type& val); //since C++ 11
iterator erase (const_iterator first, const_iterator last); //since C++ 11
参数
position:iterator 指向要从集合中删除的单个元素。
val:要从集合中删除的值。
first:要擦除的范围的开始。
last:要擦除的范围结束。
返回值
它返回一个指向已删除元素的下一个元素的迭代器或返回已删除元素的数量。
复杂度
擦除(位置):摊销常数。
擦除(val):容器大小的对数。
擦除(第一个,最后一个):第一个和最后一个之间的距离是线性的。
迭代器有效性
迭代器、引用和指向被函数删除的元素的指针无效。
所有其他迭代器、指针和引用保持其有效性。
数据竞争
容器被修改。
删除的元素被修改。尽管同时访问其他元素是安全的,但在容器中迭代范围并不安全。
异常安全
该函数不会抛出异常。
如果指定了无效的范围或位置,则会导致未定义的行为。
例子1
让我们看看通过迭代器擦除元素的简单示例。
#include <iostream>
#include <set>
using namespace std;
int main ()
{
set<int> myset;
set<int>::iterator it;
myset = {10,20,30};
cout<<"Before erasing the element:\n";
for (it=myset.begin(); it!=myset.end(); ++it)
cout << *it << '\n';
it=myset.find('b');
myset.erase (*it); // erasing by iterator
cout<<"\nAfter erasing the element:\n";
for (it=myset.begin(); it!=myset.end(); ++it)
cout << *it << '\n';
return 0;
}
输出:
Before erasing the element: 10 20 30 After erasing the element: 10 20 30
在上面的例子中,元素被迭代器 it 擦除。
例子2
让我们看一个简单的例子,用给定的键值擦除集合的元素:
#include <iostream>
#include <set>
using namespace std;
int main ()
{
set<int> myset;
set<int>::iterator it;
myset = {10, 20, 30, 40};
cout<<"Before erasing the element:\n";
for (it=myset.begin(); it!=myset.end(); ++it)
cout << *it<< '\n';
myset.erase (30); // erasing by value
cout<<"\nAfter erasing the element:\n";
for (it=myset.begin(); it!=myset.end(); ++it)
cout << *it<< '\n';
return 0;
}
输出:
Before erasing the element: 10 20 30 40 After erasing the element: 10 20 40
在上面的例子中,erase(value) 函数使用集合中的值 30。
例子3
让我们看一个简单的例子来擦除给定范围内的元素:
#include <iostream>
#include <set>
using namespace std;
int main ()
{
set<int> myset;
set<int>::iterator it;
myset = {10, 20, 30};
cout<<"Before erasing the element are:\n";
cout<<"Size is:"<<myset.size()<<'\n';
for (it=myset.begin(); it!=myset.end(); ++it)
cout << *it << '\n';
myset.erase ( myset.begin () , myset.end () ); // erasing by range
cout<<"\nAfter erasing the element are:\n";
cout<<"Size is:"<<myset.size();
for (it=myset.begin(); it!=myset.end(); ++it)
cout << *it << '\n';
return 0;
}
输出:
Before erasing the element are: Size is:3 10 20 30 After erasing the element are: Size is:0
在上面的例子中,erase(first, last) 函数用于擦除给定范围内的元素,即开始到结束。
示例 4
让我们看一个简单的例子来擦除集合中的所有奇数:
#include <set>
#include <iostream>
using namespace std;
int main()
{
set<int> m = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
// erase all odd numbers from m
cout<<"After erasing odd numbers,elements are:\n ";
for(auto it = m.begin(); it != m.end(); )
if(*it % 2 == 1)
it = m.erase(it);
else
++it;
for(auto& p:m)
cout << p << ", ";
}
输出:
After erasing odd numbers, elements are: 2, 4, 6, 8, 10, 12, 14,
在上面的例子中,所有的奇数都被擦除了,显示的是偶数。
例 5
让我们看另一个例子:
#include <set>
#include <string>
#include <iostream>
#include <iterator> // next() and prev() helper functions
using namespace std;
using myset = set<string>;
void printset(const myset& s) {
for (const auto& iter:s) {
cout << " [" << iter << "]";
}
cout << endl << "size() == " << s.size() << endl << endl;
}
int main()
{
myset s1;
// Fill in some data to test with, one at a time
s1.insert("Bob");
s1.insert("Robert");
s1.insert("Bert");
s1.insert("Rob");
s1.insert("Bobby");
cout << "Starting data of set s1 is:" << endl;
printset(s1);
// The 1st member function removes an element at a given position
s1.erase(next(s1.begin()));
cout << "After the 2nd element is deleted, the set s1 is:" << endl;
printset(s1);
// Fill in some data to test with, one at a time, using an intializer list
myset s2{ "meow", "hiss", "purr", "growl", "yowl" };
cout << "Starting data of set s2 is:" << endl;
printset(s2);
// The 2nd member function removes elements
// in the range [First, Last)
s2.erase(next(s2.begin()), prev(s2.end()));
cout << "After the middle elements are deleted, the set s2 is:" << endl;
printset(s2);
myset s3;
// Fill in some data to test with, one at a time, using emplace
s3.emplace("C");
s3.emplace("C#");
s3.emplace("D");
s3.emplace("D#");
s3.emplace("E");
s3.emplace("E#");
s3.emplace("F");
s3.emplace("F#");
s3.emplace("G");
s3.emplace("G#");
s3.emplace("A");
s3.emplace("A#");
s3.emplace("B");
cout << "Starting data of set s3 is:" << endl;
printset(s3);
// The 3rd member function removes elements with a given Key
myset::size_type count = s3.erase("E#");
// The 3rd member function also returns the number of elements removed
cout << "The number of elements removed from s3 is:" << count << "." << endl;
cout << "After the element with a key of \"E#\" is deleted, the set s3 is:" << endl;
printset(s3);
}
输出:
Starting data of set s1 is: [Bert] [Bob] [Bobby] [Rob] [Robert] size() == 5 After the 2nd element is deleted, the set s1 is: [Bert] [Bobby] [Rob] [Robert] size() == 4 Starting data of set s2 is: [growl] [hiss] [meow] [purr] [yowl] size() == 5 After the middle elements are deleted, the set s2 is: [growl] [yowl] size() == 2 Starting data of set s3 is: [A] [A#] [B] [C] [C#] [D] [D#] [E] [E#] [F] [F#] [G] [G#] size() == 13 The number of elements removed from s3 is:1. After the element with a key of "E#" is deleted, the set s3 is: [A] [A#] [B] [C] [C#] [D] [D#] [E] [F] [F#] [G] [G#] size() == 12
相关用法
- C++ set end()用法及代码示例
- C++ set equal_range()用法及代码示例
- C++ set emplace()用法及代码示例
- C++ set empty()用法及代码示例
- C++ set emplace_hint()用法及代码示例
- C++ set rbegin()用法及代码示例
- C++ set upper_bound()用法及代码示例
- C++ set swap()用法及代码示例
- C++ set size()用法及代码示例
- C++ set lower_bound()用法及代码示例
- C++ set find()用法及代码示例
- C++ set cbegin()用法及代码示例
- C++ set key_comp()用法及代码示例
- C++ set rend()用法及代码示例
- C++ set clear()用法及代码示例
- C++ set begin()用法及代码示例
- C++ set cbegin()、cend()用法及代码示例
- C++ set count()用法及代码示例
- C++ set max_size()用法及代码示例
- C++ set crend()用法及代码示例
注:本文由纯净天空筛选整理自 C++ set erase()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。