Rimuovere i valori ripetuti da un array in C e C++
In questa lezione eliminerai i valori ripetuti di un array mantenendo l'ordine della prima comparsa.
Introduzione
Per eliminare le ripetizioni mantenendo l'ordine creiamo un array di risultato separato. Per ogni elemento dell'array originale, il programma controlla se è già nell'array di risultato. Solo se non c'è ancora viene aggiunto.
Punti importanti
- Attiva gli avvisi del compilatore (compiler warning) e correggili tutti.
- Comprendi bene il tipo di dato e la durata (lifetime) di ogni valore.
- Controlla sempre i dati in ingresso e i limiti degli indici degli array.
Esempi di codice C e C++
#include <stdio.h>
int main(void) {
int input[] = {1, 2, 1, 3, 2, 4}, output[6], size = 0;
// Keep the first occurrence of every value.
for (int i = 0; i < 6; ++i) { int seen = 0; for (int j = 0; j < size; ++j) if (output[j] == input[i]) seen = 1; if (!seen) output[size++] = input[i]; }
for (int i = 0; i < size; ++i) printf("%s%d", i ? " " : "", output[i]); puts("");
}
1 2 3 4
#include <iostream>
#include <unordered_set>
#include <vector>
int main() {
std::vector input{1, 2, 1, 3, 2, 4}; std::vector<int> output; std::unordered_set<int> seen;
// Insert returns true only for the first occurrence.
for (int value : input) if (seen.insert(value).second) output.push_back(value);
for (size_t i = 0; i < output.size(); ++i) std::cout << (i ? " " : "") << output[i]; std::cout << '\n';
}
1 2 3 4
Confronto tra C e C++
Il ciclo interno controlla se input[i] compare già in output e lo registra nella variabile seen. Solo quando seen vale 0 il valore viene aggiunto in fondo a output e size aumenta. Il risultato è 1 2 3 4. Questo metodo è facile da capire ma costa O(n²). Con molti dati, in C++ si può usare std::unordered_set per controllare più velocemente.
C usa piccole funzioni procedurali e mostra apertamente come i dati sono rappresentati in memoria.
C++ continua a permettere il lavoro a basso livello, ma aggiunge tipi di libreria e astrazioni più sicure.
Esercizi di approfondimento
Esegui entrambe le versioni e poi modifica il codice per osservare la differenza di sicurezza che offre ciascun linguaggio.
- Prova input non validi e valori ai limiti.
- Compila con i flag -Wall -Wextra -Wpedantic per attivare più avvisi.
- Sposta le dichiarazioni condivise in un file header e l'implementazione in un altro file.
Esercitati con una sfida
Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.
Tutte le sfide