RISOLTO Ridimensionare Vector in C++

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

Alessandro001

Utente Attivo
Messaggi
166
Reazioni
7
Punteggio
44
Salve, vorrei sapere se è possibile diminuire la dimensione dello stesso vector in c++, mi spiego meglio.
Dato un vector<int> V caricato in questo modo 1-2-3-4-5-6, è possibile ridimensionare LO STESSO vector da inizio=i a fine=j ?
Per esempio se i=1 e j=3 allora il vector V conterrà 2-3-4
 
No, ma puoi farlo tu.
Basta copiare gli n elementi all’inizio del vettore (se mai esistesse tale resize, è quello che farebbe)
 
No, ma puoi farlo tu.
Basta copiare gli n elementi all’inizio del vettore (se mai esistesse tale resize, è quello che farebbe)
Vorrei adottare la metodologia che ho chiesto per poter velocizzare un programma che va a restringere il campo di azione all'interno del vector N volte pertanto non penso che la tua soluzione velocizzi l'esecuzione..
O sbaglio ?
 
Normalmente per ciò che chiedi si utilizzano gli indici, così da restringere il numero di elementi sui quali si opera (un esempio può essere la binary search).

Per rimpicciolire "fisicamente" il vettore devi usare il resize, o comunque come dice Achille crearti una tua implementazione (tu dovrai crearti la tua implementazione).
 
Normalmente per ciò che chiedi si utilizzano gli indici, così da restringere il numero di elementi sui quali si opera (un esempio può essere la binary search).

Per rimpicciolire "fisicamente" il vettore devi usare il resize, o comunque come dice Achille crearti una tua implementazione (tu dovrai crearti la tua implementazione).
Il codice infatti ha lo scopo di ridurre di N/2 il vector per log2N volte però non è una semplice ricerca binaria.
Una delle tante richieste è quella di ordinare il vector ad ogni iterazione e lo faccio con sort(V.begin()+primo,V.end(),confronto) dove confronto è un mio metodo e prova indica l'ultimo (N/2)+1trovato.

Il mio obiettivo è quello di eliminare la variabile primoe ridimensionare il vector in maniera da velocizzare il codice.
 
Ultima modifica:
Intanto il "Vector" non esiste, è un "Array" oppure un (meno appropriato) "vettore" ..

Una banale funzione con un paio di parametri permette di realizzare ciò che in altri linguaggi esiste nativamente per operare su Array, o stringhe, e generalmente si chiama "slice".
Più che un ridimensionamento lo vedrei come una estrazione di un sottoinsieme.

Se poi le esigenze sono di altro tipo (come l'ordinamento), allora quella funzione puoi renderla più articolata.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Intanto il "Vector" non esiste, è un "Array" oppure un (meno appropriato) "vettore" ..

Una banale funzione con un paio di parametri permette di realizzare ciò che in altri linguaggi esiste nativamente per operare su Array, o stringhe, e generalmente si chiama "slice".
Più che un ridimensionamento lo vedrei come una estrazione di un sottoinsieme.

Se poi le esigenze sono di altro tipo (come l'ordinamento), allora quella funzione puoi renderla più articolata.

Inviato dal mio Nexus 6P utilizzando Tapatalk
Quindi non esiste una funzione propria? Dovrei implementare io la funzione che mi crea un altro vettore e copia solo i valori interessati?
 
In C/C++ esiste la funzione realloc() che permette di cambiare la dimensione di un vettore (sia ampliarla che contrarla) lasciando inalterato il contenuto (nei limiti della nuova dimensione), ma iniziando sempre dall'inizio del vettore. Se hai bisogno di qualcosa piu' evoluto, devi allocare da te una nuova area, copiarvi l'area interessata del vettore originale (usando memcpy() ) e liberare il vettore originale con free()

Inutile dire che e' un metodo "costoso" in termine di tempo, in quanto la creazione di un nuovo vettore e' un processo complicato. Da non usare in un ciclo, per esempio. Sempre meglio lavorare con un vettore grande abbastanza da contenere tutti i dati, fare tutte le operazioni necessarie, e solo alla fine troncarlo (se occorre)
 
Quindi non esiste una funzione propria? Dovrei implementare io la funzione che mi crea un altro vettore e copia solo i valori interessati?

C++:
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec{ 1,2,3,4,5,6,7,8,9 };
    auto i = vec.begin() + 1;
    auto j = i + 3;

    for (auto num : vector<int>(i, j)) {
        cout << num << " " ;// prints "2 3 4"
    }

    cout << endl;
    cout << "vec capacity:" << vec.capacity() << endl; //prints 9

    vec.resize(3);
    cout << "capacity after resize:" << vec.capacity() << endl; //prints 9

    vec.shrink_to_fit();
    cout << "capacity after shrink to fit:" << vec.capacity() << endl; //prints 3

    cout << endl;

    return 0;
}

c'è un vector constructor che prende un paio di iterator e ti costruisce un nuovo vettore dato quel range come nel codice sopra (auto i e auto j sono di tipo "vector<int>::iterator").
Altrimenti puoi fare "#include <algorithm>", come _Achille ha suggerito "Basta copiare gli n elementi all’inizio del vettore" usando un algoritmo per spostare quel range che ti interessa all'inizio del tuo vector<int> esistente, e poi fare un vec.resize() (che farà il resize distruggendo gli elementi oltre le dimensioni specificate)
Anche se fai il resize e il tuo vector ha solo 3 elementi, la memoria riservata è ancora quella richiesta precedentemente ( abbastanza per contenerne 9 nell'esempio sopra (size e capacity sono due cose diverse)) quindi se vuoi ridurre anche quella, "vec.shrink_to_fit()";

Edit:
Vorrei adottare la metodologia che ho chiesto per poter velocizzare un programma che va a restringere il campo di azione all'interno del vector N
Ho letto questo soltanto dopo :P
 
Ultima modifica:
Salve, vorrei sapere se è possibile diminuire la dimensione dello stesso vector in c++, mi spiego meglio.
Dato un vector<int> V caricato in questo modo 1-2-3-4-5-6, è possibile ridimensionare LO STESSO vector da inizio=i a fine=j ?
Per esempio se i=1 e j=3 allora il vector V conterrà 2-3-4

In pratica vuoi implementare lo slicing del vettore. Purtroppo C++ non prevede una funzione del genere. La soluzione di Marcus Aseth è la più performante. Ovviamente devi ricordarti di aggiornare i due iteratori ogni volta. Se usi lo slicing in un punto del programma soltanto, allora nessun problema. Ma ovviamente stare lì ad aggiustare gli iteratori in centinaia di posti.

Boost offre Range https://www.boost.org/doc/libs/1_67_0/libs/range/doc/html/index.html per semplificare questo casino.

Altri linguaggi implementano proprio il concetto di slice.
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top