English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C ++ set erase()函数用于从set容器中删除与给定键关联的单个元素或元素范围([first,last))。因此,将通过删除元素的数量来减小大小。
void erase (iterator position); //C++ 11 之前 size_type erase (const value_type& val); //C++ 11 之前 void erase (iterator first, iterator last); //C++ 11 之前 iterator erase (const_iterator position); //从 C++ 11开始 size_type erase (const value_type& val); //从 C++ 11开始 iterator erase (const_iterator first, const_iterator last); //从 C++ 11开始
position:迭代器,指向要从集合中删除的单个元素。
val:要从集合中删除的值。
first:要擦除范围的开始。
last:要擦除范围的末尾。
Restituisce un puntatore all'elemento successivo eliminato, o restituisce il numero di elementi eliminati.
erase(position): costante a spalla.
erase (val): il logaritmo della dimensione del contenitore.
erase(first,last): la distanza tra il primo e l'ultimo è lineare.
Gli iteratori, i riferimenti e i puntatori all'elemento eliminato diventano non validi.
Tutti gli altri iteratori, puntatori e riferimenti mantengono la loro validità.
Il contenitore è stato modificato.
L'elemento eliminato verrà modificato. Anche se è sicuro accedere ad altri elementi contemporaneamente, non è sicuro iterare su un intervallo nel contenitore.
Questa funzione non lancia eccezioni.
Se si specifica un intervallo o una posizione non valida, ciò può causare comportamento non definito.
Ecco un esempio semplice per vedere come eliminare elementi tramite iteratore.
#include <iostream> #include <set> using namespace std; int main() { set<int> myset; set<int>::iterator it; myset = { 10,20,30 } ; cout << "Eliminazione dell'elemento prima: \n"; for (it=myset.begin(); it!=myset.end(); ++it) cout << *it << '\n'; it=myset.find('b'); myset.erase(*it); // Eliminazione tramite iteratore cout << "\nEliminazione dell'elemento dopo: \n"; for (it=myset.begin(); it!=myset.end(); ++it) cout << *it << '\n'; return 0; }
Output:
Prima di cancellare l'elemento: 10 20 30 Eliminazione dell'elemento dopo: 10 20 30
Nell'esempio sopra, l'elemento è stato eliminato tramite l'iteratore.
Ecco un esempio semplice per vedere come eliminare elementi da un set utilizzando una chiave data:
#include <iostream> #include <set> using namespace std; int main() { set<int> myset; set<int>::iterator it; myset = {10, 20, 30, 40}; cout << "Eliminazione dell'elemento prima: \n"; per (it=myset.begin(); it!=myset.end(); ++it){ cout << *it << '\n'; } myset.erase(30); // Eliminazione di un valore specifico cout << "\nEliminazione dell'elemento dopo: \n"; per (it=myset.begin(); it!=myset.end(); ++it){ cout << *it << '\n'; } return 0; }
Output:
Prima di cancellare l'elemento: 10 20 30 40 Dopo aver cancellato l'elemento: 10 20 40
Nell'esempio sopra, la funzione erase (value) utilizza il valore 30 nel set.
Ecco un esempio semplice per vedere come eliminare elementi in un intervallo dato:
#include <iostream> #include <set> using namespace std; int main() { set<int> myset; set<int>::iterator it; myset = { 10, 20, 30 }; cout << "Eliminazione dell'elemento prima: \n"; cout << "Dimensione è: " << myset.size() << '\n'; per (it=myset.begin(); it!=myset.end(); ++it){ cout << *it << '\n'; } myset.erase(myset.begin(), myset.end()); // Eliminazione di un intervallo specifico cout << "\nEliminazione dell'elemento dopo: \n"; cout << "Dimensione è: " << myset.size(); per (it=myset.begin(); it!=myset.end(); ++it){ cout << *it << '\n'; } return 0; }
Output:
Prima di cancellare l'elemento: La dimensione è: 3 10 20 30 Dopo aver cancellato l'elemento: La dimensione è: 0
Nell'esempio precedente, è stato utilizzato il funzione Erase(first, last) per cancellare gli elementi con un intervallo dato (cioè da inizio a fine).
Guardiamo un esempio semplice per rimuovere tutti i numeri dispari da una集合:
#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}; // Rimuovere tutti i numeri dispari da m cout << "Eliminati i numeri dispari, gli elementi sono:\n\t"; for (auto it = m.begin(); it != m.end();){ if (*it % 2 == 1) { it = m.erase(it); } ++it; } } for (auto& p : m) { cout << p << ", "; } }
Output:
Gli elementi dopo aver rimosso i numeri dispari sono: 2, 4, 6, 8, 10, 12, 14,
Nell'esempio precedente, tutti gli numeri dispari sono stati rimossi e mostrati come numeri pari.
Guardiamo un altro esempio:
#include <set> #include <string> #include <iostream> #include <iterator> // Funzioni ausiliarie next() e prev() 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; // Inserire alcuni dati per il test, uno alla volta s1.insert("Bob"); s1.insert("Robert"); s1.insert("Bert"); s1.insert("Rob"); s1.insert("Bobby"); cout << "I dati iniziali della集合s1 sono:" << endl; printset(s1); // Primo membro della funzione elimina l'elemento nella posizione data s1.erase(next(s1.begin())); cout << "Dopo aver eliminato l'elemento numero 2, la集合s1 diventa:" << endl; printset(s1); // Utilizza l'elenco di inizializzazione per inserire un singolo dato da testare myset s2{ "meow", "hiss", "purr", "growl", "yowl" }; cout << "I dati iniziali della集合s2 sono:" << endl; printset(s2); // La seconda funzione membro elimina gli elementi // Intervallo [First, Last) s2.erase(next(s2.begin()), prev(s2.end())); cout << "Dopo aver eliminato l'elemento centrale, la集合s2 diventa:" << endl; printset(s2); myset s3; // Utilizza emplace per inserire un singolo dato da testare 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 << "I dati iniziali della集合s3 sono:" << endl; printset(s3); // La terza funzione membro elimina l'elemento con una chiave data myset::size_type count = s3.erase("E#"); // La terza funzione membro anche restituisce il numero di elementi eliminati cout << "Il numero di elementi eliminati da s3 è: " << count << "." << endl; cout << "Dopo aver eliminato l'elemento con chiave "E#", la集合s3 diventa:" << endl; printset(s3); }
Output:
I dati iniziali della集合s1 sono: [Bert] [Bob] [Bobby] [Rob] [Robert] size() == 5 Dopo aver eliminato l'elemento numero 2, la集合s1 diventa: [Bert] [Bobby] [Rob] [Robert] size() == 4 I dati iniziali della集合s2 sono: [growl] [hiss] [meow] [purr] [yowl] size() == 5 Dopo l'eliminazione dell'elemento centrale, l'insieme s2 diventa: [growl] [yowl] size() == 2 Dati iniziali dell'insieme s3: [A] [A#] [B] [C] [C#] [D] [D#] [E] [E#] [F] [F#] [G] [G#] size() == 13 Numero di elementi eliminati da s3: 1. Eliminato l'elemento con chiave “E#”, l'insieme s3 diventa: [A] [A#] [B] [C] [C#] [D] [D#] [E] [F] [F#] [G] [G#] size() == 12