STL中的容器分為兩大類:序列式容器和關(guān)聯(lián)式容器。
序列式容器有vector、list、deque、forward_list等,為什么他們被稱為序列式容器呢?因?yàn)樗麄兊牡讓訛榫€性序列的數(shù)據(jù)結(jié)構(gòu),里面存儲(chǔ)的是元素本身。關(guān)聯(lián)式容器也是用來(lái)存儲(chǔ)數(shù)據(jù)的,與序列式容器不同的是,其里面存儲(chǔ)的是
鍵值對(duì)用來(lái)表示具有一一對(duì)應(yīng)關(guān)系的一種結(jié)構(gòu),該結(jié)構(gòu)中一般只包含兩個(gè)成員變量key和value,key代表鍵值,value表示與key對(duì)應(yīng)的信息。
SGI-STL中關(guān)于鍵值對(duì)的定義:
struct pair
{typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair():first(T1()),second(T2())//零初始化
{}
pair(const T1& a,const T2& b):first(a),first(b)
{}
};
有下面這幾種方法來(lái)構(gòu)造鍵值對(duì):
int main()
{pairv;//v被定義為鍵值對(duì)類型,那就有了兩個(gè)成員變量
v.first = 1;
v.second = "hello";
cout<< v.first<< " : "<< v.second<< endl;//1 : hello
pairv1(2, "Linux");
cout<< v1.first<< " : "<< v1.second<< endl;//2 : Linux
v = v1;
cout<< v.first<< " : "<< v.second<< endl;//2 : Linux
pairv2 = make_pair(3, "C++");
cout<< v2.first<< " : "<< v2.second<< endl;//3 : C++
return 0;
}
set
基本介紹注意:
驗(yàn)證set中的元素默認(rèn)按照小于進(jìn)行排序:
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
setis(iv.begin(), iv.end());
for (const auto &e : is)
cout<< e<< " ";//1 2 3 4 5 6 7 8 9
cout<< endl;
}
如果想要從大到小排序,則在構(gòu)造的時(shí)候加上greater:
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
set>is(iv.begin(), iv.end());
for (const auto &e : is)
cout<< e<< " ";//9 8 7 6 5 4 3 2 1
cout<< endl;
}
set的模板參數(shù)列表template, class Alloc = allocator>class set;
set的構(gòu)造T:set中存放元素的類型,實(shí)際在底層存儲(chǔ)
的鍵值對(duì)
Compare:set中元素默認(rèn)按照小于來(lái)比較
Alloc:set中元素空間的管理方式,使用STL提供的空間配置器。
void main()
{sets1;//構(gòu)造空的set
int ar[] = {8,5,3,7,6,4,2,9,1 };
int n = sizeof(ar) / sizeof(ar[0]);
sets2(ar, ar + n);//用(first,last)區(qū)間中的元素構(gòu)造set
vectorvi = {8,5,3,7,6,4,2,9,1 };
sets3(vi.begin(), vi.end());//用(first,last)區(qū)間中的元素構(gòu)造set
s1 = s3;//拷貝構(gòu)造
}
set的迭代器set的修改操作函數(shù)聲明 | 功能 |
---|---|
pair | 在set中插入元素x,實(shí)際插入的是 |
size_type erase ( const key_type& x ) | 刪除set中值為x的元素,返回被刪除的元素的個(gè)數(shù) |
void erase ( iterator position ) | 刪除set中position位置上的元素 |
void erase ( iterator first, iterator last ) | 刪除set中(first,last)區(qū)間中的元素 |
size_type count ( const key_type& x ) const | 返回set中值為x的元素的個(gè)數(shù) |
void swap ( set | 交換set中的元素 |
swap代碼驗(yàn)證:
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
setis(iv.begin(), iv.end());
vectoriv1 = {6,7,8,3 };
setis1(iv1.begin(), iv1.end());
is1.swap(is);
}
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
setis(iv.begin(), iv.end());
auto res = is.lower_bound(7);//>=7
//auto res = is.upper_bound(6);//>6
cout<< *res<< endl;
}
map
基本介紹typedef pair value_type;
template,//比較器的類型
class Alloc = allocator>//通過(guò)空間配置器來(lái)申請(qǐng)底層空間
>class map;
map的構(gòu)造void main()
{mapismap;
mapismap = {{5,"Student"},{2,"Teacher"},{4,"Job"} };
}
map的迭代器map的元素訪問(wèn)函數(shù)聲明 | 功能 |
---|---|
size_type size() const | 返回map中有效元素的個(gè)數(shù) |
mapped_type& operator[] (const key_type&k) | 返回key對(duì)應(yīng)的value |
void main()
{mapismap = {{5,"Student"},{2,"Teacher"},{4,"Job"} };
cout<< ismap.size()<< endl;//3
cout<< ismap.at(4)<< endl;//Job
cout<< ismap[4]<< endl;//Job
cout<< ismap[8]<< endl;//""
//cout<< ismap.at(9)<< endl;//會(huì)拋出異常
}
在元素訪問(wèn)時(shí),at函數(shù)和operator[]都能通過(guò)key找到與key對(duì)應(yīng)的value然后返回其引用,不同的是:當(dāng)key不存在時(shí),operator[]用默認(rèn)value和key構(gòu)造鍵值對(duì)然后插入,返回該默認(rèn)value,at()函數(shù)直接拋出異常。
map中元素的修改函數(shù)聲明 | 功能 |
---|---|
pair | 在map中插入鍵值對(duì)x,返回值也是一個(gè)鍵值對(duì),iterator代表新插入元素的位置,bool代表是否插入成功 |
size_type erase ( const key_type& x ) | 刪除值為x的元素 |
void erase ( iterator position ) | 刪除position位置上的元素 |
void erase ( iterator first, iterator last ) | 刪除(first,last)區(qū)間中的元素 |
size_type count ( const key_type& x ) const | 返回set中值為x的元素的個(gè)數(shù) |
void swap ( set | 交換set中的元素 |
const_iterator find ( const key_type& x )const | 在map中查找key為x的元素,找到返回該元素的位置的const迭代器,否則返回cend |
size_type count ( const key_type& x ) const | 返回key為x的鍵值在map中的個(gè)數(shù),注意map中key是唯一的,因此該函數(shù)的返回值要么為0,要么為1,因此可以用來(lái)檢測(cè)一個(gè)key是否在map中 |
查找和插入:
void main()
{//2 4 5 8
mapismap = {{5,"Student"},
{2, "Teacher"}, {8, "Study"}, {4, "Job"} };
auto pos = ismap.find(8);//查找,找到返回該元素的迭代器
cout<< pos->first<< " : "<< pos->second<< endl;
pairv = {1,"abc" };
ismap.insert(pos, v);//插入,pos表示新插元素的位置
cout<< pos->first<< " : "<< pos->second<< endl;
for (const auto& e : ismap)
cout<< e.first<< " : "<< e.second<< endl;
}
map總結(jié)你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)頁(yè)題目:【C++】關(guān)聯(lián)式容器-map和set-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://jinyejixie.com/article48/dcjshp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、軟件開(kāi)發(fā)、Google、網(wǎng)站設(shè)計(jì)、商城網(wǎng)站、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容