bein en fait avec des maps je vois pas comment utiliser set_intersection avec des maps, avec les vectors j'y arrive mais pas avec les map :s. Je pige pas pourquoi mon code me retourne pas ce que je veux d'ailleurs pour le coup....
bein en fait avec des maps je vois pas comment utiliser set_intersection avec des maps, avec les vectors j'y arrive mais pas avec les map :s. Je pige pas pourquoi mon code me retourne pas ce que je veux d'ailleurs pour le coup....
Sinon, ton code est erroné, car:
sera toujours vrai.
Code : Sélectionner tout - Visualiser dans une fenêtre à part (Ym.find((*it).first) != NULL)
idem pour:
les fonctions find() de la STL renvoient toujours un itérateur, donc elles ne renvoient jamais NULL. Si l'élément recherché n'est pas trouvé, cette fonction retourne l'itérateur spécial end().
Code : Sélectionner tout - Visualiser dans une fenêtre à part (Zm.find((*it).first) != NULL)
Il faut donc remplacer tes tests par:
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part if ( Ym.find((*it).first) != Ym.end() )
Code : Sélectionner tout - Visualiser dans une fenêtre à part if ( Zm.find((*it).first) != Zm.end() )
Alors là je dois dire merci, nan nan pire que ca MERCIIIIIIIIIIIIIII. Comment débloquer une situation qui paraissait désespérée depuis lundi. Plein de bisous
Problème résolu à 100 %, merci beaucoup ca va me faire rattraper mon retard.
Ce n'est effectivement pas évident d'utiliser les algorithmes set_xxx avec des maps. Je n'y suis pas encore arrivé en tout cas.
En effet, le back_inserter utilise la fonction membre push_back du conteneur de destination, et map n'a pas de push_back. J'ai essayé avec un simple insert_iterator, mais je ne comprend pas trop ce qu'il se passe, ça ne fonctionne pas. Dès que j'aurais un peu de temps, j'y regarderai de plus près.
En attendant, pour ceux que ça intéresse, voici le code que j'utilise pour essayer de trouver une solution (code qui est censé solutionner le problème de ce topic):
Evidemment, dans ce cas précis, personnellement, j'aurais intégré le valeur du niveau de gris dans la classe MyPoint, mais j'aimerais bien parvenir à faire fonctionner ces fonctions de set_xxx avec des maps
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 #include <iostream> #include <map> #include <algorithm> #include <iterator> using namespace std; struct MyPoint { MyPoint( unsigned int px = 0, unsigned int py = 0 ) : x(px), y(py) {} unsigned int x; unsigned int y; }; ostream& operator << ( ostream & os, const MyPoint & pt ){ os << "x: " << pt.x << " , y: " << pt.y; return os;} bool operator < ( const MyPoint & left, const MyPoint & right ) { if ( left.x < right.x ) return true; if ( left.x == right.x ) return ( left.y < right.y ); return false; } bool operator == ( const MyPoint & right, const MyPoint & left ) { return ( right.x == left.x && right.y == left.y ); } typedef pair<MyPoint, unsigned int> PPair; bool operator < ( const PPair & left, const PPair & right ) { return ( left.first < right.first ); } bool operator == ( const PPair & left, const PPair & right ) { return ( left.first == right.first ); } ostream& operator << ( ostream & os, const PPair & ppair ){ os << ppair.first << " , value: " << ppair.second << endl; return os;} typedef map<MyPoint, unsigned int> PMap; typedef PMap::iterator PMapIt; void PrintPMap( const PMap & pm, ostream & os = cout ) { copy( pm.begin(), pm.end(), ostream_iterator<PPair>(os)); } int main(int argc, char** argv){ PMap m1, m2, m3; m1.insert( PPair( MyPoint( 10, 20 ), 128 ) ); m1.insert( PPair( MyPoint( 15, 10 ), 212 ) ); m1.insert( PPair( MyPoint( 5, 30 ), 124 ) ); m1.insert( PPair( MyPoint( 10, 40 ), 65 ) ); cout << "map1:" << endl; PrintPMap( m1 ); m2.insert( PPair( MyPoint( 15, 20 ), 89 ) ); m2.insert( PPair( MyPoint( 15, 10 ), 54 ) ); m2.insert( PPair( MyPoint( 5, 30 ), 212 ) ); m2.insert( PPair( MyPoint( 12, 30 ), 165 ) ); cout << endl << "map2:" << endl; PrintPMap( m2 ); set_intersection( m1.begin(), m1.end(), m2.begin(), m2.end(), std::insert_iterator<PMap>( m3, m3.begin() ) ); //ici ça ne fonctionne pas, aucun élément n'est inséré dans m3 cout << endl << "map3:" << endl; PrintPMap( m3 ); cout << "end" << endl; cin.get(); return 0; }
edit: une solution pourrait consister à créer notre propre inserter. Mais j'aimerais trouver plus simple.
insert_iterator est sensé inséré à un endroit spécifié, notion qui n'est pas supportée par les maps...
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
arf...
vois-tu une solution alors?
Je ne comprends pas très bien.
un std::inserter utilise la méthode insert qui pour un set ou un map peut prendre un deuxième paramètre qui est une position dans la map.
Ce paramètre n'est qu'une indication, il ne précise pas que l'on va insérer à un endroit précis, c'est un "hint".
Ces algorithmes sont fait pour fonctioner avec des sets, donc il n'y a pas de raison que ça ne marche pas.
Perso j'aurais ptet fait une struct/classe avec un CPoint et un niveau de gris, une manière de trier tout ça et envoyer tout ça dans un set.
Hmm... je n'y comprend plus rien
Je n'ai pas la norme sous les yeux, mais dans l'implémentation de <iterator> que j'ai sous la main (gcc 4.1.2), l'operateur d'affectation du insert_iterator est:
Le premier paramètre (iter) est un iterateur, et __value la valeur à insérer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 insert_iterator& operator=(const typename _Container::const_reference __value) { iter = container->insert(iter, __value); ++iter; return *this; }
D'apres cgi.com, la map implémente une fonction membreDonc ça devrait marcher non?
Code : Sélectionner tout - Visualiser dans une fenêtre à part iterator insert(iterator pos, const value_type& x)
Mais alors pourquoi le code que j'ai posté ci-dessus ne fonctionne pas?
edit: nikko34, je n'avais pas vu ton post, mais en fait nous disons la même chose.
edit2:Je suis d'accord, c'est en substance ce que j'avais dit quelques posts auparavant. Mais on ne connait pas suffisamment le contexte pour être sûr.Envoyé par nikko34
Salut.
Y as un truc que je ne pige pas.
Tu as trois images et tu fais du traitement dessus. C'est bien Çà?
Pourquoi ne pas traiter ton problème par des images???
Tu parcoure tes trois images en même temps et tu fait ce que tu as à faire.
Ce que j'ai du mal à comprendre est que parle de point 2D et ensuite de 3D![]()
Partager