Newsgroup: it.comp.lang.c++
Titolo: vector

Salve a tutti.
Dato il seguente codice:
#include <vector>
#include <iostream.h>
typedef vector<int> vInt;
int main (int argc, char** argv) {
  vInt  vi_Dati;
  int   iNumero = 10;
  vi_Dati.insert(&vi_Dati[0], iNumero++);
  cout <<"\nValore inserito nel vettore: "
       <<vi_Dati[0]
       <<endl;
  vInt  *pvi_Dati = new vInt();
  // RIGA ERRATA.
  pvi_Dati->insert(&pvi_Dati[0], iNumero);
  cout <<"\nValore inserito nel vettore: "
       <<*pvi_Dati[0]
       <<endl;
  return 0;
}
ottengo che alla ottava riga, partendo dal basso, il compilatore
(egcs-1.0.3a-14, sotto Linux) mi "spara" il seguente errore:
vector.cpp: In function `int main(int, char **)':
vector.cpp:19: no matching function for call to
`vector<int,__default_alloc_template<true,0> >::insert
(vector<int,__default_alloc_template<true,0> > *, int &)'
/usr/include/g++/stl_vector.h:182: candidates are:
vector<int,__default_alloc_template<true,0> >::insert(int *, long int,
const int &)
/usr/include/g++/stl_vector.h:179:                
vector<int,__default_alloc_template<true,0> >::insert(int *, int, const
int &)
/usr/include/g++/stl_vector.h:359:                
vector<int,__default_alloc_template<true,0> >::insert(int *, unsigned
int, const int &)
/usr/include/g++/stl_vector.h:167:                
vector<int,__default_alloc_template<true,0> >::insert(int *)
/usr/include/g++/stl_vector.h:157:                
vector<int,__default_alloc_template<true,0> >::insert(int *, const int
&)
vector.cpp:23: no match for
`*vector<int,__default_alloc_template<true,0> > &'
C'e' qualcuno che mi sa dire come devo modificare la riga ?
Ciao, U D A.
-- 
<><><><><><><><><><><><><><><><><><><><><><><><
UDA'Software
mailto:
u...@freemail.it
mailto:
uda.so...@iol.it
http://www.GeoCities.com/SiliconValley/Bay/2165

        <<*pvi_Dati[0]
       <<(*pvi_Dati)[0]
EMG


Scusa, sono un babbeo :(
Non avevo pensato che un '[0]' potesse venire male interpretato !
Provo con un riga che dovrebbe chiarire meglio quello che vorrei fare:
	pvi_Dati->insert(&pvi_Dati[i], iNumero);
Se 'pvi_Dati' non lo dichiaro come un Puntatore, la sintassi sopra va
bene (sostituendo -> con . , ovviamente); il problema sorge quando
dichiaro una roba del tipo:
	vInt	*pviDati = new vInt();
La Funzione Membro 'insert' della Classe Template 'vector' chiede, come
primo parametro (se non erro) un Riferimento alla Locazione di Memoria
che desidero modificare; dichiarando la variabile come puntatore e'
evidente che "ritorno" qualcos'altro ....
Posso dire di averle provate veramente (quasi) tutte (anche senza
significato):
	pvi_Dati->insert(pvi_Dati[i], iNumero);
	pvi_Dati->insert(*pvi_Dati[i], iNumero);
	pvi_Dati->insert(&(*pvi_Dati[i]), iNumero);
	pvi_Dati->insert(*(&pvi_Dati[i]), iNumero);
	....ecc....
Purtroppo, alla fine, il risultato e' sempre il solito errore del
compilatore; dannazione, sti puntatori mi fanno tribolare: non riesco a
capire quale arcaica sintassi devo sfruttare ;)
Aiuto !!
***
Cmq, GRAZIE per la risposta, U D A.

 che desidero modificare;
No, richiede un iteratore. La sintassi che ti ho dato io funziona
perfettamente.
EMG


A questo punto temo di non essere piu' sicuro di avere capito come
funziona la:
		iterator insert(iterator position, const T& x)
Il Primo Parametro e' si' un Iteratore ma, considerando il Nome della
Variabile (position), pensavo che si riferisse alla Posizione del
Vettore nella quale si desidera inserire 'x', o sbaglio ?
****
Se io scrivo una cosa tipo:
		vi_Dati.insert(vi_Dati.begin(), iNumero);
suppongo che iNumero venga inserita all'Inizio del vettore
(presumibilmente nella posizione 0) mentre se scrivo una cosa tipo:
		vi_Dati.insert(vi_Dati.end(), iNumero);
la inserisca alla fine.
Ebbene, io non voglio inserire 'iNumero' all'Inizio o alla Fine, ma in
una posizione 'i' conosciuta solo durante l'esecuzione del programma,
con una sintassi tipo:
		vi_Dati.insert(&vi_Dati[i], iNumero);
che, se 'vi_Dati' non e' dichiarata come Puntatore, funziona
perfettamente; il problema nasce quando vi_Dati e' dichiarata come:
		vInt	*vi_Dati = new vInt(); // Dove vInt e' un: typedef vector<int>
vInt;
e
		vi_Dati->insert(&vi_Dati[i], iNumero);
non funziona, comprensibilmente, piu' :(
****
Scusa se insisto ma a questo punto sono piuttosto confuso .... spero che
tu sia cosi' gentile da chiarirmi le idee (:-)
Grazie ancora e Ciao, U D A.

 tu sia cosi' gentile da chiarirmi le idee (:-)
E' un bene che tu insista, anche se non sono sicuro al 100% di riuscire
a chiarirti le idee, dato che io stesso non le ho chiarissime
sull'argomento templates e libreria standard C++.
EMG

 EMG
Invece le hai chiare perche', grazie ai tuoi consigli, sono riuscito a
risolvere il problema; sinceramente non riesco a capire perche' non ci
sia riuscito dopo la prima risposta, dato che avevi gia' scritto quello
che dovevo fare e, nonostante fossi convinto di averlo fatto, non
funzionava .... avro' commesso qualche distrazione.
****
Spero di fare cosa gradita, agli altri neofiti come me, postando un
pezzo di codice che mostra un esempio di utilizzo dei 'vector' e di
'ifstream'; se ci sono errori o imprecisioni spero che qualcuno abbia la
pazienza di correggerli, cosi' che pure io possa migliorare.
****
// UDA'Software 1999
// File: stream.cxx
// Version 0.2.00
/*
Questo programma serve per testare la classe standard istream.
In particolare, si vuole:
1) Verificare la Presenza di un file dati (ProgramType.dat); il file
deve essere contenuto nella medesima directory dell'eseguibile,
quindi, e' necessario ricavare il percorso di quest'ultimo.
2) Aprire il file dati in Lettura.
3) Immagazzinare tutte le righe del file, tranne la prima, in un
vettore dinamico.
4) Stampare a video il contenuto del vettore.
5) Chiudere il file
*/
#include <fstream.h>
#include <iostream.h>
#include <string.h>
#include <string>
#include <vector>
#define STR_NOME_FILE_DATI	"ProgramType.dat"
#define MAXBUFFER		512
#define SLASH			"/"
typedef vector<char*>		vString;
int main (int argc, char** argv) {
  // Calcola il percorso completo del File Dati basandosi su quello
  // dell'Eseguibile. Praticamente, elimina il Nome dell'Eseguibile
  // cercando il primo slash (sotto Linux/UNIX e' '/' mentre sotto
  // windows e' necessario cercare '\\') e accodare al percorso
  // rimanente il Nome del File Dati.
  const char	*psPathDatFile = string(string(argv[0]).substr(0,
int(string(argv[0]).rfind(SLASH) + 1)) + 
				       string(STR_NOME_FILE_DATI)).c_str();
  // Comunica all'utente che il file Dati viene aperto in lettura.
  cout <<"\nApertura del file: "
       <<psPathDatFile
       <<endl;
  // Apre in lettura il File Dati.
  ifstream	*pifsFileDati = new ifstream(psPathDatFile, ios::in);
  // Se non riesce ad aprire il file ....
  if (!(*pifsFileDati)) {
    // .... comunica opportuno messaggio di errore ed ....
    cout <<"\nAttenzione !! Impossibile aprire in lettura il file: "
	 <<psPathDatFile
	 <<endl;
    // .... esce con errore.
    return 1;
  }
  char		*psBuffer;			// Una Stringa temp.
  vString	*pvS_FileDati = new vString();	// Il Vettore Dinamico.
  int		i = 0;
  psBuffer = new char[MAXBUFFER];
  // Immagazzina la prima riga del file 'a vuoto'.
  pifsFileDati->getline(psBuffer, MAXBUFFER);
  // Legge dal file tutte le righe presenti e le immagazzina nel
  // vettore dinamico.
  while (! pifsFileDati->eof()) {
    psBuffer = new char[MAXBUFFER];
    pifsFileDati->getline(psBuffer, MAXBUFFER);
    pvS_FileDati->insert(&(*pvS_FileDati)[i++], psBuffer);
  }
  // Chiude il File Dati.
  pifsFileDati->close();
  delete pifsFileDati;
  // Stampa il contenuto del vettore dinamico.
  for (i = 0; i < pvS_FileDati->size(); i++)
    cout <<i
	 <<"\t-> "
	 <<(*pvS_FileDati)[i]
	 <<endl;
  delete pvS_FileDati;
  return 0;
}
****
Con il compilatore egcs-1.0.3a-14 (cioe' quello in mio possesso) e'
possibile compilare il codice sopra con il seguente comando:  g++ -g -o
stream stream.cxx
Per la cronaca: il file "ProgramType.dat" puo' essere un qualsiasi file
di testo.
****
Grazie per l'aiuto.
Ciao, U D A.