Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - funzione reverse per i vettori
Forum - C/C++ - funzione reverse per i vettori

Avatar
vale77777 (Normal User)
Newbie


Messaggi: 15
Iscritto: 08/10/2018

Segnala al moderatore
Postato alle 23:37
Mercoledì, 23/09/2020
visto che devo invertire solo una parte del vettore, mi chiedevo se fosse possibile fare
std::reverse(myvector.at(3),myvector.at(5));

o se lo devo per forza fare tra il primo e ultimo elemento, ho un vettore così fatto 1236547, devo invertire solo 654 e ottenere 1234567... ho provato ma mi fa errore

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 9:16
Venerdì, 25/09/2020
Non conosco STL abbastanza bene da risponderti in modo diretto.
Ipotizzando del tutto arbitrariamente che il tuo array contenga degli int, in C sarebbe semplice risolvere il "caso" con una funzione tipo quella che riporto qui sotto. Se scambi il tipo int con il tipo che ti interessa, penso che il procedimento potrebbe funzionare anche in C++. Certo è che se il tipo che devi usare riguarda oggetti per i quali la costruzione di copie è "impegnativa", lo scambio impostato nel ciclo for rischia di rivelarsi parecchio inefficiente.

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. /*==============================================================================
  4. Inverte l'ordine degli elementi dell'array puntato da a compresi tra i limiti
  5. p e u (inclusi).
  6. E' responsabilita' del chiamante assicurarsi che i limiti p e u siano compresi
  7. entro le dimensioni dell'array.
  8.  
  9. PARAMETRI
  10.     a   array
  11.     p   primo elemento della sezione da invertire
  12.     u   ultimo elemento della sezione da invertire
  13.  
  14. VALORE DI RITORNO
  15.     int     1 se l'operazione e' andata a buon fine
  16.             0 se i parametri non sono accettabili
  17. ==============================================================================*/
  18.  
  19. int inverti_sezione_array( int *a, int p, int u ) {
  20.     if( NULL!=a && p>=0 && u>=0 && p<=u ) {
  21.         int l = p+(u-p+1)/2;   /* l: limite */
  22.  
  23.         for( ; p<l; ++p, --u ) {
  24.             int t = a[p]; /* t: temporaneo */
  25.             a[p] = a[u];
  26.             a[u] = t;
  27.         }
  28.  
  29.         return 1; /* tutto bene */
  30.     }
  31.  
  32.     return 0; /* parametri non validi */
  33. }
  34.  
  35. int main() {
  36.     int serie[] = {1,2,3,6,5,4,7}; // serie di prova
  37.     int i, qElSerie = 7; // qElSerie: quantita' degli elementi nella serie
  38.  
  39.     for( i=0; i<qElSerie; ++i )
  40.         printf( "%d%c", serie[i], i<qElSerie-1?' ':'\n' );
  41.  
  42.     inverti_sezione_array( serie, 3, 5 ); /* non controllo il valore di   **
  43.                                           ** ritorno perche' so per certo **
  44.                                           ** che i parametri  sono validi */
  45.  
  46.     for( i=0; i<qElSerie; ++i )
  47.         printf( "%d%c", serie[i], i<qElSerie-1?' ':'\n' );
  48.  
  49.     return 0;
  50. }



ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote