RISOLTO Funzione std::swap in std::reverse

Stato
Discussione chiusa ad ulteriori risposte.

Alessandro001

Utente Attivo
166
7
CPU
Ryzen 5 1600 3.2GHz
Scheda Madre
MSI B350 Tomahawk
HDD
Seagate ST1000DM010 1 TB
RAM
2X8GB Corsair CMK16GX4M2B3000C15 Vengeance
GPU
RADEON RX 580 NITRO+ Radeon RX 580 8GB GDDR5
Monitor
HP 27FW Monitor 27"
PSU
Cooler Master MasterWatt Lite 700 230V
Case
Aerocool Aero-800
Net
https://www.speedtest.net/result/8773872068.png
OS
Windows 10
Salve, stavo guardando la funzione reverse su cplusplus ed ho notato una cosa che non mi è chiara.
Esordisco dicendo che ho poca dimestichezza con gli iteratori che al più presto studierò.

La funzione reverse ha questi parametri (str.begin(), str.end()) quindi rispettivamente il puntatore alla prima cella su cui applicare il metodo ed il puntatore all'ultima cella+1 su cui applicare il metodo.
Quindi se la stringa è "Ciao" str.begin() punterà a C mentre str.end() punterà subito dopo o.

Nel metodo reverse viene richiamata la funzione swap con parametri (first, last).
Dato che la funzione swap non fa altro che scambiare di posizione i valori passati, il valore puntato da first diventerà il valore puntato da last e viceversa. Però last è uguale all'ultima cella+1 pertanto come fa a scambiare i due valori?
Mi spiego con un esempio:

Se la stringa è S = "ciao"
first punterà a 'c' e last punterà ad 'o'+1
quando invocherà il metodo swap come fa a scambiare 'c' con 'o' se last non punta ad o?
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
std::reverse non richiama std::swap bensì std::iter_swap.

last è semplicemente decrementato prima della chiamata a std::iter_swap.
Questa è la probabile implementazione da cppreference
C++:
template<class BidirIt>
void reverse(BidirIt first, BidirIt last) {
    while ((first != last) && (first != --last)) {
        std::iter_swap(first++, last);
    }
}
 
  • Mi piace
Reazioni: Alessandro001
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!