std::list::remove în C++

remove() șterge din listă toate elementele egale cu o valoare; unique() șterge duplicatele consecutive.

Sintaxă
size_type remove(const T& valoare);            // returnează size_type din C++20
size_type remove_if(Pred conditie);
size_type unique();
size_type unique(BinaryPred egale);

Ce face std::list::remove

Spre deosebire de std::remove din <algorithm>, funcția membră remove a listei chiar șterge elementele (le scoate din listă și le distruge). remove_if face același lucru pentru elementele care îndeplinesc o condiție.

unique() păstrează doar primul dintr-un grup de elemente egale aflate unul după altul. Ca să elimini toate duplicatele, sortează întâi lista. Din C++20, toate aceste funcții returnează numărul de elemente șterse.

Parametri

Parametru Descriere
valoare Elementele egale cu ea sunt șterse.
conditie Pentru remove_if: funcție care returnează true pentru elementele de șters.
egale Pentru unique: opțional, funcție care spune dacă două elemente vecine sunt „egale”.

Ce returnează

Numărul de elemente șterse (din C++20; înainte, void).

Exemple

Exemplul 1: remove și remove_if

#include <list>
#include <print>

int main() {
    std::list<int> v{3, 0, 7, 0, 2, 0, 9};
    auto n = v.remove(0);
    std::println("Am șters {} zerouri: {}", n, v);
    v.remove_if([](int x) { return x > 5; });
    std::println("Fără cele peste 5: {}", v);
}

Rezultat

Am șters 3 zerouri: [3, 7, 2, 9]
Fără cele peste 5: [3, 2]

Exemplul 2: unique: doar duplicatele vecine

Prima dată rămâne un 1 la final, pentru că nu era lângă celelalte. După sortare, unique elimină toate duplicatele.

#include <list>
#include <print>

int main() {
    std::list<int> v{1, 1, 2, 2, 2, 3, 1};
    v.unique();
    std::println("{}", v);
    v.sort();
    v.unique();
    std::println("{}", v);
}

Rezultat

[1, 2, 3, 1]
[1, 2, 3]

Greșeli frecvente

  • Te aștepți ca unique() să elimine toate duplicatele dintr-o listă nesortată. Elimină doar repetițiile consecutive; apelează întâi sort().

Comenzi înrudite

  • std::list: Listă dublu înlănțuită: inserare și ștergere rapidă oriunde, fără invalidarea celorlalte elemente, dar fără acces după poziție.
  • std::list::sort: sort() sortează lista schimbând doar legăturile dintre noduri; reverse() inversează ordinea elementelor.
  • std::erase_if: Șterge dintr-un container toate elementele egale cu o valoare (std::erase) sau care îndeplinesc o condiție (std::erase_if).
  • std::unique: Elimină duplicatele aflate unul lângă altul; după sortare, elimină toate duplicatele.
  • std::remove: Mută la final elementele egale cu o valoare și returnează noul sfârșit; ștergerea reală se face cu erase.