RISOLTO Ridimensionare Vector in C++

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

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
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

Moderatore
Staff Forum
Utente Èlite
2,208
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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

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
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
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
Reazioni: Mursey

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
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
6,440
5,091
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
Reazioni: Alessandro001

Marcus Aseth

Utente Attivo
404
138
OS
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
Reazioni: Alessandro001

pabloski

Utente Èlite
2,868
916
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
Reazioni: Alessandro001
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili