推 Arim:謝謝大大的回覆^^ 05/15 20:31
110515 修改搜尋方式
※ 編輯: loveme00835 來自: 140.121.197.115 (05/15 20:59)
※ 引述《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