RISOLTO Ridimensionare Vector in C++

Stato
Discussione chiusa ad ulteriori risposte.

Alessandro001

Nuovo Utente
141
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, 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
 

_Achille

Utente Èlite
3,011
694
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
No, ma puoi farlo tu.
Basta copiare gli n elementi all’inizio del vettore (se mai esistesse tale resize, è quello che farebbe)
 

Alessandro001

Nuovo Utente
141
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
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 ?
 

DispatchCode

Utente Attivo
603
362
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
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).
 

Alessandro001

Nuovo Utente
141
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
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:

rctimelines

Utente Èlite
4,443
1,501
Hardware Utente
CPU
AMD Ryzen 7 2700X | INTEL i5-6600k | INTEL i5-4460... altri
Dissipatore
wraith MAX | Arctic Freezer 11LP | stock
Scheda Madre
Asrock Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
Hard Disk
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
Scheda Video
RadeonPro WX3100 4G | KFA2 GTX 970 4G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | Acer 24" FHD | Benq 19" FHD
Sistema Operativo
Windows10-pro64/OpenSUSE-QL42.3/Manjaro-17.0.2-KDE
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
 
  • Mi piace
Reactions: Mursey

Alessandro001

Nuovo Utente
141
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
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?
 

Andretti60

Utente Èlite
3,721
2,501
Hardware Utente
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)
 
  • Mi piace
Reactions: Alessandro001

Marcus Aseth

Utente Attivo
386
127
Hardware Utente
Sistema Operativo
Windows 10
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:
  • Mi piace
Reactions: Alessandro001

pabloski

Utente Èlite
1,971
405
Hardware Utente
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.
 
  • Mi piace
Reactions: Alessandro001
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando