RISOLTO Funzione std::swap in std::reverse

Stato
Discussione chiusa ad ulteriori risposte.

Alessandro001

Nuovo Utente
137
6
Hardware Utente
CPU
Ryzen 5 1600 3.2GHz
Scheda Madre
MSI B350 Tomahawk
Hard Disk
Seagate ST1000DM010 1 TB
RAM
2X8GB Corsair CMK16GX4M2B3000C15 Vengeance
Scheda Video
RADEON RX 580 NITRO+ Radeon RX 580 8GB GDDR5
Monitor
HP 27FW Monitor 27"
Alimentatore
Cooler Master MasterWatt Lite 700 230V
Case
Aerocool Aero-800
Internet
https://www.speedtest.net/result/8773872068.png
Sistema Operativo
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,004
691
Hardware Utente
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
Hard Disk
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
Scheda Video
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
Alimentatore
RM550X
Case
NZXT S340
Periferiche
Cooler Master XT; Razer Abyssus
Sistema Operativo
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
Reactions: Alessandro001
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando