PROBLEMA C++ errore su push_back

Peri

Nuovo Utente
82
3
Questo è il codice semplificato che isola il problema riscontrato

C++:
#include <vector>
using namespace std;
class Banana{int n;};
int main(){
  vector <Banana> Pane;
  Pane.push_back(2);
  return 0;}

Il compilatore mi restituisce un errore bello grosso su push_back.
causato, secondo me, dal fatto che io abbia inserito una classe.

Ad ogni modo vorrei creare un vettore con soli oggetti di tipo Banana.
Inizialmente pensavo a:
Banana* Pane;
Ma volevo conservare tutti i vantaggi della classe vector, c'è modo di fare ciò che pensavo?
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,210
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
Dovresti riportare l'errore...
Verosimilmente sarà comunque dovuto al check sul tipo di dato che stai usando.

Scusa ma... se fai un vector di banane, perché mai inserire un numero intero (che potrebbe essere una quantità)?
 

Peri

Nuovo Utente
82
3
Evidentemente non ho capito cosa fa push_back, ma se così fosse ci arriveremo. Intanto mando l'errore

Il compilatore scrive su Terminale di Linux Ubuntu in risposta del comando:
g++ ao.cpp
ove "ao.cpp" è un file di estensione .cpp chiamato "ao" con al suo interno il codice prima scritto
Codice:
ao.cpp: In function ‘int main()’:
ao.cpp:9:19: error: no matching function for call to ‘std::vector<Banana>::push_back(int)’
    9 |   Pane.push_back(2);
      |                   ^
In file included from /usr/include/c++/9/vector:67,
                 from ao.cpp:1:
/usr/include/c++/9/bits/stl_vector.h:1184:7: note: candidate: ‘void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = Banana; _Alloc = std::allocator<Banana>; std::vector<_Tp, _Alloc>::value_type = Banana]’
 1184 |       push_back(const value_type& __x)
      |       ^~~~~~~~~
/usr/include/c++/9/bits/stl_vector.h:1184:35: note:   no known conversion for argument 1 from ‘int’ to ‘const value_type&’ {aka ‘const Banana&’}
 1184 |       push_back(const value_type& __x)
      |                 ~~~~~~~~~~~~~~~~~~^~~
/usr/include/c++/9/bits/stl_vector.h:1200:7: note: candidate: ‘void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = Banana; _Alloc = std::allocator<Banana>; std::vector<_Tp, _Alloc>::value_type = Banana]’
 1200 |       push_back(value_type&& __x)
      |       ^~~~~~~~~
/usr/include/c++/9/bits/stl_vector.h:1200:30: note:   no known conversion for argument 1 from ‘int’ to ‘std::vector<Banana>::value_type&&’ {aka ‘Banana&&’}
 1200 |       push_back(value_type&& __x)
      |                 ~~~~~~~~~~~~~^~~

Ripeto, evidentemente non ho capito come si usa push_back o cosa faccia (ho visto degli esempi di utilizzo ma evidentemente ho tratto le conclusioni sbagliate ahahahahha)
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,210
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
Il modo in cui utilizzi la funzione in sé è corretto.
Ti ho risposto in quel modo poiché utilizzando i vettori mi aspettavo conoscessi anche le classi così come gli oggetti (che sono un'istanza di una classe). Visto che quando dichiari il vector devi specificare il tipo di dato, quel vettore può contenere solo quel tipo di dato.

Nel tuo caso il tipo di dato si chiama Banana. Quindi puoi inserire solo un oggetto di tipo Banana.
Quindi qualcosa tipo:

C++:
Banana banana(2);
Pane.push_back(banana);
 
  • Mi piace
Reazioni: Peri

theprogrammer.99

Nuovo Utente
96
34
Usi il push_back e la classe vector senza sapere cosa stai facendo? Ma che modi di programmare è? Ai miei tempi si studiava prima di scrivere codice...
 

Peri

Nuovo Utente
82
3
Il modo in cui utilizzi la funzione in sé è corretto.
Ti ho risposto in quel modo poiché utilizzando i vettori mi aspettavo conoscessi anche le classi così come gli oggetti (che sono un'istanza di una classe). Visto che quando dichiari il vector devi specificare il tipo di dato, quel vettore può contenere solo quel tipo di dato.

Nel tuo caso il tipo di dato si chiama Banana. Quindi puoi inserire solo un oggetto di tipo Banana.
Quindi qualcosa tipo:

C++:
Banana banana(2);
Pane.push_back(banana);
Aaaaaaaa io credevo che push_back(2) inserisse 2 banane nel vettore.
Vabbè ora rivedo bene le definizioni (non sono molto ferrato in inglese spero di non sbagliarmi di nuovo ahahahahahhaha)

Grazie mille!
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,210
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
Aaaaaaaa io credevo che push_back(2) inserisse 2 banane nel vettore.
Vabbè ora rivedo bene le definizioni (non sono molto ferrato in inglese spero di non sbagliarmi di nuovo ahahahahahhaha)

Grazie mille!
Di nulla, comunque... Mi sembra piuttosto chiaro l'inglese della doc. :)

Adds a new element at the end of the vector, after its current last element. The content of val is copied (or moved) to the new element.

This effectively increases the container size by one, which causes an automatic reallocation of the allocated storage space if -and only if- the new vector size surpasses the current vector capacity.

Piuttosto mi chiedo: stai usando vector, ma sai come funziona? Cioè, sai cos'è?
 
  • Mi piace
Reazioni: Peri

Peri

Nuovo Utente
82
3
Di nulla, comunque... Mi sembra piuttosto chiaro l'inglese della doc. :)



Piuttosto mi chiedo: stai usando vector, ma sai come funziona? Cioè, sai cos'è?
Vector so essere una classe definita nella libreria omonima e, come tutte le classi che ho visto fino ad ora, contiene dei metodi e attributi accessibili (o pubblici formalmente parlando).
Poi ovviamente ogni metodo ha la sua sintassi e la sua definizione (quello che fa). In questo caso molto banalmente pensavo che push_back dicesse "aggiungi un tot di spazi e poi con il metodo at li puoi riempire".
Ma, in vista di questa correzione, mi vien da pensare che "il numero di spazi" di vector sia ingestibile (cioè indirettamente intendo), semplicemente aggiungi, leggi o togli roba.
Poi vabbè, a quanto ho capito, i dati che inserisco in vector sono salvati su un vettore (a cui non ho proprio un accesso diretto) e ad ogni modifica delle sue dimensioni sposta tutto in un nuovo vettore più grande (suppongo... o almeno farei così in C). Poi, se non ricordo male, a parte la grandezza del vettore, ci sono anche altre variabili che ha in pancia ma non mi ricordo quali siano o a cosa servano.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,210
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
Poi ovviamente ogni metodo ha la sua sintassi e la sua definizione (quello che fa). In questo caso molto banalmente pensavo che push_back dicesse "aggiungi un tot di spazi e poi con il metodo at li puoi riempire".

Bhe ok, vector è una classe e fa uso di template, quindi ha dei metodi per poter agire sui dati.
Comunque no, push_back inserisce un nuovo elemento; altrimenti immagina i tempi di inserimento quali sarebbero...

Poi vabbè, a quanto ho capito, i dati che inserisco in vector sono salvati su un vettore (a cui non ho proprio un accesso diretto) e ad ogni modifica delle sue dimensioni sposta tutto in un nuovo vettore più grande (suppongo... o almeno farei così in C). Poi, se non ricordo male, a parte la grandezza del vettore, ci sono anche altre variabili che ha in pancia ma non mi ricordo quali siano o a cosa servano.

Quando crei un nuovo vector viene allocata della memoria, il tuo push_back va quindi ad occupare una cella dell'array allocato in precedenza.
vector è un array dinamico, in sostanza. Non sei tu ad operare sull'array e ad occuparti di allocare nuova memoria quando la capienza è stata raggiunta, ma lo fa in maniera trasparente al suo interno.

Già dalla doc si capisce, ma puoi anche cercare un'implementazione: https://github.com/gcc-mirror/gcc/blob/master/libstdc++-v3/include/bits/stl_vector.h#L1186
 
  • Mi piace
Reazioni: Peri

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili