-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
24 lines (22 loc) · 4.73 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>set、map、priority_queue自定义比较函数</title>
<url>/2021/09/30/first/</url>
<content><![CDATA[<p>set、map容器采用红黑树(平衡二叉搜索树)实现。<br>在定义容器时,如果没有指定比较函数,那么采用默认的比较函数,即按键值由小到大的顺序插入元素。而在很多情况下,需要自定义比较函数。</p>
<p>方法1: 如果元素不是结构体,那么,可以编写比较函数。<br> 其中,”<”为从大到小排列,”>”从小到大排列。</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">//按键值由小到大插入元素</span><br><span class="line">//元素不是结构体</span><br><span class="line">#include<set> </span><br><span class="line">#include<iostream></span><br><span class="line">using namespace std;</span><br><span class="line"></span><br><span class="line">//自定义比较函数myComp(),重载"()"操作符</span><br><span class="line"></span><br><span class="line">struct myComp</span><br><span class="line">{</span><br><span class="line"> bool operator()(const int& a, const int& b){</span><br><span class="line"> if(a!=b) return a>b;</span><br><span class="line"> else return a>b;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line">int main(int argc, int **argv){</span><br><span class="line"> set<int,myComp> s;</span><br><span class="line"> s.insert(8);</span><br><span class="line"> s.insert(1);</span><br><span class="line"> s.insert(12);</span><br><span class="line"> s.insert(6);</span><br><span class="line"> s.insert(8); //8重复,不会插入</span><br><span class="line"> set<int,myComp>::iterator it;</span><br><span class="line"> for(it=s.begin();it!=s.end();++it){</span><br><span class="line"> cout<<*it<<" "; //输出 12 8 6 1</span><br><span class="line"> }</span><br><span class="line"> cout<<endl;</span><br><span class="line"> return 0;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>方法2: 如果元素为结构体,把比较函数写进结构体内</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">struct Info</span><br><span class="line">{</span><br><span class="line"> string name;</span><br><span class="line"> float score;</span><br><span class="line"> //score由大到小排列。若要由小到大排列,使用>即可</span><br><span class="line"> bool operator < (const Info & a) const{</span><br><span class="line"> return a.score<score;</span><br><span class="line"> }</span><br><span class="line">};</span><br><span class="line">int main(int argc, int **argv){</span><br><span class="line"> set<Info> s;</span><br><span class="line"> Info info;</span><br><span class="line"> info.name="Jack";</span><br><span class="line"> info.score=80.5;</span><br><span class="line"> s.insert(info);</span><br><span class="line"> info.name="Tomi";</span><br><span class="line"> info.score=20.5;</span><br><span class="line"> s.insert(info);</span><br><span class="line"> info.name="Nacy";</span><br><span class="line"> info.score=60.5;</span><br><span class="line"> s.insert(info);</span><br><span class="line"> set<Info>::iterator it;</span><br><span class="line"> for(it=s.begin();it!=s.end();++it){</span><br><span class="line"> cout<<(*it).name<<" : "<<(*it).score<<endl;</span><br><span class="line"> //Jack : 80.5</span><br><span class="line"> //Nacy : 60.5</span><br><span class="line"> //Tomi : 20.5</span><br><span class="line"> }</span><br><span class="line"> return 0;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>优先级队列的自定义比较函数也类似,”>”为小顶堆,”<”为大顶堆。使用时:</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">priority_queue<int,vector<int>,myComp> pq;</span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category>计算机</category>
</categories>
<tags>
<tag>数据结构</tag>
<tag>算法</tag>
</tags>
</entry>
</search>