Souci avec "Vector"...
Fermé
Hurobaki
Messages postés
53
Date d'inscription
dimanche 23 mars 2014
Statut
Membre
Dernière intervention
10 mars 2017
-
Modifié par baladur13 le 17/04/2016 à 18:28
cptpingu Messages postés 3836 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 11 février 2023 - 18 avril 2016 à 12:04
cptpingu Messages postés 3836 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 11 février 2023 - 18 avril 2016 à 12:04
A voir également:
- Souci avec "Vector"...
- True vector internet monitor - Forum Windows
- Vector works mac - Télécharger - CAO-DAO
- Vector magic gratuit ✓ - Forum Graphisme
- Magnat vector 55 - Forum Matériel informatique
- Afficher un vector c++ ✓ - Forum C++
3 réponses
Dalfab
Messages postés
703
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
1 mars 2023
100
18 avril 2016 à 02:54
18 avril 2016 à 02:54
Bonjour,
Le problème est dans Sensor.
A l'insertion dans la table, une copie est faite. La recherche dans la table doit se faire sur un critère de reconnaissance.
Le problème est dans Sensor.
A l'insertion dans la table, une copie est faite. La recherche dans la table doit se faire sur un critère de reconnaissance.
- Ou bien le Sensor a une sémantique de valeur et il doit avoir un opérateur d'égalité, la recherche se fera alors par ce test. Par exemple bool operator==( const Sensor& s1, const Sensor &s2) { return s1.nom==s2.nom; }. Un Sensor est identifié par son contenu.
- Ou bien le Sensor a une sémantique d'entité et la table doit recevoir des pointeurs intelligents qui pourront être comparés (la création d'un Sensor est unique, et il est reconnaissable par son adresse)
Hurobaki
Messages postés
53
Date d'inscription
dimanche 23 mars 2014
Statut
Membre
Dernière intervention
10 mars 2017
18 avril 2016 à 09:59
18 avril 2016 à 09:59
Bonjour merci de ta réponse,
J'aimerai faire cela par adresse, si j'ai bien compris je créé une copie dans la méthode et donc cette copie ne possède pas la même adresse que mon objet initial.
Donc pour modifier cela je dois créer un vector de Sensor* ? Ou le problème vient de ma fonction ?
Merci d'avance
J'aimerai faire cela par adresse, si j'ai bien compris je créé une copie dans la méthode et donc cette copie ne possède pas la même adresse que mon objet initial.
Donc pour modifier cela je dois créer un vector de Sensor* ? Ou le problème vient de ma fonction ?
Merci d'avance
cptpingu
Messages postés
3836
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 février 2023
2
Modifié par cptpingu le 19/04/2016 à 11:10
Modifié par cptpingu le 19/04/2016 à 11:10
Bonjour.
Plus simplement, utilise la méthode "find" + "erase" de std::vector. (Cette méthode ne fonctionne qui si tu suis ce que préconise Dalfab, c'est-à-dire si tu donnes à ta classe Sensor un moyen de la comparer avec d'autres Sensor, donc de lui définir son "operator==()").
Exemple:
Quelques conseils:
Exemple:
Ce qui te permet de faire, au choix:
Plus simplement, utilise la méthode "find" + "erase" de std::vector. (Cette méthode ne fonctionne qui si tu suis ce que préconise Dalfab, c'est-à-dire si tu donnes à ta classe Sensor un moyen de la comparer avec d'autres Sensor, donc de lui définir son "operator==()").
Exemple:
bool Zone::removeSensor(const Sensor& s)
{
auto found = _sensors.find(s);
if (found == _sensors.end()) // Si non trouvé
return false;
_sensors.erase(found);
return true;
}
Quelques conseils:
- Évite les using namespace, c'est ultra crade et dangereux. Voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace/
- Différencie un attribut de classe d'une variable. Généralement, on met un "_" devant. Au lieu de "vector<Sensor> sensors;" préfère: "std::vector<Sensor> _sensors;".
- Pour les extensions, utilise .cc/.hh ou .cpp/.hpp, mais évite le .h qui est plutôt pour du C (ce n'est pas une erreur technique, mais une convention un peu plus propre).
- Pour faire un affichage, laisse le choix du flux à l'utilisateur (qui mettra un std::cout, un std::cerr ou un flux de fichier).
Exemple:
void Zone::displayContent(std::ostream& out)
{
out << "My vector contains:" << std::endl;
for (auto& elt : _sensors)
out << elt << std::endl;
out << "Thats all" << std::endl;
}
Ce qui te permet de faire, au choix:
zone.displayContent(std::cout); // Affichage sortie standard
zone.displayContent(std::err); // Affichage sortie erreur
std::ofstream file("toto.txt"); // Écriture dans un fichier
zone.displayContent(file);