看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《Arim (Arim5566)》之銘言: : 各位板友好 : 小弟現在碰到一個問題 : 以下是我的程式碼的部份 : struct p : { : int x; : int y; : p(const int ix,const int iy): : x(ix),y(iy){} : bool operator<(const p & cp) const : { : return x< cp.x; //根據x值做排序 : } : } : //現在我宣告一個set : set<p> sp; : sp.insert(p(25,0)); : sp.insert(p(555,1)); : sp.insert(p(35,2)); : sp.insert(p(35,3)); //問題1:目前sp並沒有p(35,3),但是卻放不進去(sp會判斷說已 : //經有(35,3)了) : int c=R.size(); : cout<c<<endl; //本來預期要有4個元素,但是卻只有3個元素(少了p(35,3)) : 如果把set改成multiset可以解決第一個問題(why??) : 但是在計算p(35,3)的時候 : int t=R.count(p(35,3)); : cout<<t<<endl; //問題2:預期應該只有一個p(35,3),但是這邊卻是印出兩個... : 感覺在這邊set似乎沒辦法"完全"根據struct的內容正確地分別每個要insert的element : 像上面的例子set把p(35,3)跟p(35,2)判斷成同一個東西 : 請問為什麼會出現這種情形?? : 請問有什麼辦法可以解決這種情形嘛?? : 謝謝各位板友的指教 大家好,我是原po 我把operator改成 if(x==cp.x) { return y!=cp.y; //在這邊不知道f(x,y)跟f(y,x)都是true的時候,set會怎麼做?? } else { return x<cp.x; } 這樣就可以解決上述的問題,但是還是會有問題 set<p> sp; sp.insert(p(25,5)); sp.insert(p(25,1)); sp.insert(p(35,2)); sp.insert(p(35,3)); cout<<sp.size()<<endl; //是4個沒錯 set<p>::iterator tmp_it=sp.find(p(25,5)); int c=sp.count(p(25,0)); //計算p(25,5)的個數 cout<<c<<endl; //p(25,5)目前有一個,印出1,沒錯 cout<<(*tmp_it).x<<" " <<(*tmp_it).y<<endl; //印出座標25 5 沒錯 //以下是問題的部份 set<p>::iterator tmp_it=sp.find(p(25,1)); int c=sp.count(p(25,1)); cout<<c<<endl; //印出0,why?? 那sp.size()為什麼會是4?? cout<<(*tmp_it).x<<" " <<(*tmp_it).y<<endl; //不知道為啥會印出4 25 (不知道怎麼 來的...) 我把sp裏面的element都印出來順序會是 p(25,1) p(25,5) p(35,3) p(35,2) 如果把y!=cp.y改成y<cp.y就一切正常(每個point都可以找到),但是set的順序不是我要的 我希望set的順序就是依照x值排序就好 以上述的例子set裏面的順序我期待的會是 p(25,5) p(25,1)//如果有一樣的x的話,就照insert的順序來排... p(35,2) p(35,3) 也就是如果寫成multimap<key=x,value=y>的話,multimap裏面的順序就是 我預期在set裏面排出來的順序 不知道要怎麼改operator才可以達成預期的結果? 謝謝各位板友的指教 -- ~宅男的四個徵兆~ ∠□ ○ ! * \○/ ★    (○ ? ╦╦└□ " ○□═ □   □> ║║√√ ╦══╦ ∥    |\ 一回家就上PTT 每天想正妹 以當好人為樂 忘記正妹虧欠自己 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.197.57
firejox:這樣你只要比較x就好了... 05/15 13:49
firejox:找Px插入set中的x值比他大的前面即可... 05/15 13:52