Problema iteratori liste c++

di Anonimizzato15490 il
4 risposte
Salve, in questo periodo sto imparando ad utilizzare la stl del c++.

Quello che vorrei fare è fare un confronto con l'elemento successivo rispetto a quello puntato dall'iteratore. Ad esempio,io vorrei fare una cosa del genere:
#include <iostream>
#include <cstdlib>

using namespace std;
struct Nodo{
    int numero;
    Nodo* next;
};
int main()
{
    Nodo* inizioLista = new Nodo[sizeof(Nodo)];
    Nodo* p = inizioLista;

    inizioLista->numero = 10;
    inizioLista->next = NULL;

    if (p->next == NULL)
        cout << "p = NULL" << endl;

    return 0;
}
Solo che vorrei farla con la stl e con gli iteratori, è possibile?

4 Risposte

  • In quei termini no.
    In stl quel codice si traduce come:
    
        std::list<int> my_list;
        my_list.push_back(10);
    
        std::list<int>::iterator it = my_list.begin();
    
        if (it == my_list.end())
            cout << "end list" << endl;
    
    
    ossia l'intervallo è sempre valido tra my_list.begin() e my_list.end().
    (A seconda dello standard del compilatore che stai usando, l'esempio può variare. Questo è codice pre C++11)


    Tutte le operazioni come
    
       inizioLista->next = NULL;
    
        if (p->next == NULL)
    
    sono gestite internamente a std::list senza possibilità di accesso.
  • Quindi una cosa del genere non sarebbe possibile
    
    #include <list>
    
    std::list<int> myList;
    std::list<int> itr = myList.begin();
    myList.push_back(8);
    
    if (itr->next == NULL)
           cout << "Lista vuota";
    
    Ovviamente questa parte non può compilarla "itr->next == NULL", non esiste qualche funzione per fare un confronto del genere?
  • Quindi una cosa del genere non sarebbe possibile
    No, std::list<> solleva lo sviluppatore dalla gestione a basso livello dei meccanismi di gestione e permette di concentrarsi solo sul dato in se. Ossia non occorre preoccuparsi di puntatori next, previous et similia.
    esiste qualche funzione per fare un confronto del genere?
    Per controllare se una lista è vuota è sufficiente invocare la funzione empty()
    mentre per controllare se si è raggiunto il fine lista si procede come ti ho indicato prima.
    Qui c'è un buon reference sulle varie funzioni di std::list<>
    http://en.cppreference.com/w/cpp/container/lis
  • Ok, ho capito. grazie mille per l'aiuto
Devi accedere o registrarti per scrivere nel forum
4 risposte