2010-05-08 5 views
4

Si j'ai un C++ et mis iterator:C++ - Out objets Imprimer Set De

set<Person> personList; 
set<Person>::const_iterator location; 

Comment puis-je imprimer le contenu de l'ensemble? Ils sont tous des objets personnels, et j'ai surchargé opérateur < < pour Personne.

La ligne que des erreurs est une base pour la boucle:

cout << location 

Netbeans donne:

proj.cpp:78: error: no match for ‘operator<<’ in ‘std::cout << location’

On dirait qu'il veut une surcharge pour l'opérateur du iterator < <. Fondamentalement, je prends des objets qui étaient stockés dans un format de tableau, mais qui sont maintenant dans un ensemble. Quel est l'équivalent de cout << array[i] pour les ensembles?

Répondre

5

Vous devez déréférencer le iterator:

std::cout << *location; 

La convention d'utilisation du indirection ou opérateur de déréférencement pour obtenir la valeur référencée pour un itérateur a été choisi par analogie avec les pointeurs:

person* p = &somePerson; 
std::cout << *p; 
+1

+1 pour la plupart réponse directe à la question de l'OP. –

+0

Oh, je vois. C'est aussi pourquoi l'opérateur flèche me permet d'accéder aux champs de l'objet. Merci! –

+0

Je peux imprimer un ensemble sans utiliser un itérateur, comme: 'pour (int i = 0; i <= s.size(); ++ i) cout << s [i] <<" ";' comme nous faisons en cas de vecteurs. Je l'ai fait et il n'a pas trouvé de correspondance pour 'operator []' dans 's [i]' – Sunny

10

En C++ 11, pourquoi utiliser une boucle for quand vous pouvez utiliser une boucle foreach?

#include <iostream> //for std::cout 

void foo() 
{ 
    for (Person const& person : personList) 
    { 
     std::cout << person << ' '; 
    } 
} 

En C++ 98/03, pourquoi utiliser une boucle for lorsque vous pouvez utiliser un algorithme à la place?

#include <iterator> //for std::ostream_iterator 
#include <algorithm> //for std::copy 
#include <iostream> //for std::cout 

void foo() 
{ 
    std::copy(
     personList.begin(), 
     personList.end(), 
     std::ostream_iterator(std::cout, " ") 
     ); 
} 

Notez que cela fonctionne avec une paire de itérateurs, non seulement ceux de std::set<t>. std::copy utilisera votre operator<< défini par l'utilisateur pour imprimer chaque article à l'intérieur du set en utilisant cette seule instruction.

+0

+1, je n'ai jamais vu ça auparavant. – Puppy

+1

+1, j'adore le plaidoyer STL :) –

5

il est un ensemble :: iterator

for(it = output_set.begin(); it != output_set.end(); it++) 
    { 
     outstream_1 << *it << endl; 
    }