作者Arim (Arim5566)
看板C_and_CPP
標題Re: [問題] 關於set中的struct
時間Sun May 15 12:53:52 2011
※ 引述《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