看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《Arim (Arim5566)》之銘言: : 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?? 他回傳的值是讓以下兩個條件都成立的物件 x 的個數: 1. x < p(25,1) == false 2. p(25,1) < x == false : cout<<(*tmp_it).x<<" " <<(*tmp_it).y<<endl; //不知道為啥會印出4 25 (不知道怎麼 : 來的...) 因為沒有找到相等的Key,所以tmp_it即為sp.end(), 對它作取值的 動作是UB(Undefined Behavior). : 我把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才可以達成預期的結果? : 謝謝各位板友的指教 C++03並無規定容器中如果已有相等Key的元素時, 新插入的元素應 該擺放在哪, 所以你不應該依賴這個特性, 為了完成你要的功能, 不必強迫自己使用某種容器, 如果沒有合用的可以考慮自己寫一個 . 但是這裡就有一個好 vector, 不用嗎? http://goo.gl/FT61z 當然如果有很嚴格的效率需求, 用 std::multiset可以省去對整個 容器排序的時間, 但是插入的時候還是要套 std::upper_bound 才 能保留你的插入順序(從begin開始算. 甚至是它內部結構 - 異Key 元素之間的相對位置) -- ▂▂ ▄▂ T.T.L Listen 2 http://ppt.cc/jIUk ˇ ˇˇ ˇ 說什麼結束 ▃▃ http://ppt.cc/zQtB ψ髮箍 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115
Arim:謝謝大大的回覆^^ 05/15 20:31
110515 修改搜尋方式 ※ 編輯: loveme00835 來自: 140.121.197.115 (05/15 20:59)