English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C++ set erase() 使用方法及示例

STL Set(集合)C++

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:要擦除范围的末尾。

Valore di ritorno

Restituisce un puntatore all'elemento successivo eliminato, o restituisce il numero di elementi eliminati.

Complessità

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.

Validità degli iteratori

Gli iteratori, i riferimenti e i puntatori all'elemento eliminato diventano non validi.

Tutti gli altri iteratori, puntatori e riferimenti mantengono la loro validità.

Conflitto di dati

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.

Sicurezza delle eccezioni

Questa funzione non lancia eccezioni.

Se si specifica un intervallo o una posizione non valida, ciò può causare comportamento non definito.

Esempio 1

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.

Esempio 2

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.

Esempio 3

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).

Esempio 4

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.

Esempio 5

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

STL Set(集合)C++