PROBLEMA C++ errore su push_back

Peri

Nuovo Utente
32
0
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

Utente Attivo
893
556
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
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
32
0
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

Utente Attivo
893
556
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
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);
 
  • Like
Reactions: Peri

theprogrammer.99

Nuovo Utente
95
33
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
32
0
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

Utente Attivo
893
556
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
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'è?
 
  • Like
Reactions: Peri

Peri

Nuovo Utente
32
0
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

Utente Attivo
893
556
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
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
 
  • Like
Reactions: Peri

Entra

oppure Accedi utilizzando

Hot: PS5 VS XBOX X/S?

  • Playstation 5

    Voti: 296 63.5%
  • XBOX Series X/S

    Voti: 170 36.5%

Discussioni Simili