Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C++] Funzionamento iteratori

    Non ho capito bene come usare gli iteratori, se io scrivo questo codice:

    codice:
    #include <cstdlib>
    #include <vector>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    /*
     * 
     */
    int main(int argc, char** argv) {
    
        string result="";
        vector<int> array(10);
        vector<int> ::iterator it=array.begin();
        int k;
        
        for(int i=0; i<array.size(); i++)
            array[i]=i;
    Vorrei concatenare nella stringa result il contenuto dell' array, come faccio a fare avanzare l' iteratore?

    codice:
     for(int i=0; it!=array.end(); ++it)
    Questa è la sintassi che ho trovato, non capisco perchè l' incremento dell' iteratore è fatto usando la notazione prefissa....poi potrei fare una cosa come:

    codice:
    result+=*it;
    ?

    Suppongo di no perchè così concateno un puntatore ad un intero...

  2. #2
    Stai facendo pasticci mescolando la sintassi di indice con quella di iteratore... per ciclare su un vector (o su un qualunque altro container della STL) con gli iteratori si fa:
    codice:
    for(vector<int>::iterator it=array.begin(); it!=array.end(); ++it)
    {
        // ... codice del ciclo ...
    }
    Dentro al ciclo per ottenere l'elemento corrente basta fare *it, ovvero "dereferenziare" l'iteratore (metto "dereferenziare" tra virgolette perché un iteratore non è necessariamente un puntatore). Se volessi stampare tutti gli elementi, farei:
    codice:
    for(vector<int>::iterator it=array.begin(); it!=array.end(); ++it)
    {
        cout<<*it<<" ";
    }
    L'incremento dell'iteratore solitamente si fa con la notazione prefissa perché in genere è più efficiente (si risparmia una copia); con i puntatori è indifferente (l'ottimizzatore vede che il valore restituito non viene usato e evita la copia), ma con gli iteratori, che sono oggetti più complicati, il compilatore può non essere così furbo.

    Quanto al tuo problema, la cosa più semplice è usare uno stringstream, ovvero uno stream che invece di scrivere su schermo o su file fornisce una std::string contenente tutto quello che si è scritto:
    codice:
    #include <vector>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    int main(int argc, char** argv) {
        string result="";
        vector<int> array(10);
        ostringstream os;
    
        for(vector<int>::iterator it=array.begin(); it!=array.end(); ++it)
            os<<*it<<" ";
        result=os.str();
    In ogni caso, l'uso degli iteratori per i vector è in genere inutilmente pesante (come sintassi), dato che per container con accesso casuale O(1) come i vector non c'è alcun vantaggio in termini di prestazioni ad usare gli iteratori piuttosto che l'usuale notazione ad indice (array[i]). Discorso diverso invece per altri container, ad esempio, per le list, a cui si può accedere solo tramite gli iteratori.

    Tieni comunque presente che il nuovo standard C++ consente di alleggerire un po' la sintassi degli iteratori con il nuovo "range-based for loop":
    codice:
    for(int & i: array)
        os<<i<<" ";
    che altro non è che "zucchero sintattico" per l'equivalente loop fatto con gli iteratori.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Ottima risposta tipica di un buon analista programmatore

    Non conosco gli stream credo che opterò per l' uso dello stream di output.

    Colgo l' occasione per un' altra questione...solitamente se in Java devo concatenare una stringa posso fare una cosa come:

    codice:
    public class Prova
    {
    	public static void main(String [] args)
    	{
    		String s="Francesco";
    		s+=" Birbonacci "+20;
    		System.out.println(s);
    	}
    }
    Mentre in C++ se non sbaglio non posso concatenare un numero in una stringa ma devo convertire. Mi sapresti suggerire qual è il metodo migliore? Ho letto del metodo ATOI o una cosa simile, ma con tutti gli esempi in inglese non ho capito proprio nulla.

    P.S ma esiste un sito dove consultare tutte le librerie standard tipo la Javadoc?

    Grazie.

  4. #4
    Originariamente inviato da Darèios89
    Ottima risposta tipica di un buon analista programmatore

    Non conosco gli stream credo che opterò per l' uso dello stream di output.
    Non sono nulla di trascendentale: alla fine è come un cout ma che scrive su std::string.
    Colgo l' occasione per un' altra questione...solitamente se in Java devo concatenare una stringa posso fare una cosa come:

    codice:
    public class Prova
    {
    	public static void main(String [] args)
    	{
    		String s="Francesco";
    		s+=" Birbonacci "+20;
    		System.out.println(s);
    	}
    }
    Mentre in C++ se non sbaglio non posso concatenare un numero in una stringa ma devo convertire. Mi sapresti suggerire qual è il metodo migliore? Ho letto del metodo ATOI o una cosa simile, ma con tutti gli esempi in inglese non ho capito proprio nulla.
    I modi tipici del C sono itoa e sprintf (meglio snprintf), ma in C++ la cosa più semplice è usare gli string stream:
    codice:
    ostringstream os;
    os<<"Francesco"<<" Birbonacci "<<20;
    cout<<os.str();
    (naturalmente qui avresti fatto prima a scrivere direttamente su cout).

    Spesso però farebbe comodo poter fare come in Java e avere una conversione "al volo" a std::string; per questo in Boost fornisce il lexical_cast e il nuovo standard C++ fornisce std::to_string.
    P.S ma esiste un sito dove consultare tutte le librerie standard tipo la Javadoc?
    Puoi usare cppreference.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.