日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

C++?primer超詳細講解關(guān)聯(lián)容器_C 語言

作者:撲街男孩 ? 更新時間: 2022-08-23 編程語言

允許重復關(guān)鍵字的容器的名字開中都有包含單詞multi,不保持關(guān)鍵字按順序存儲的容器的名字都以unordered開頭。

使用關(guān)聯(lián)容器

(1)經(jīng)典的map程序

單詞計數(shù)程序

map<string, size_t>word_count;
string word;
while (cin >> word)
	++word_count[word];
for (const auto& w : word_count)
	cout << w.first << " occurs " << w.second << " 次 " << endl;

(2)set的使用

//忽略exclude中的單詞進行計數(shù)
map<string, size_t>word_count;
set<string> exclude = { "the","but" };
string word;
while (cin >> word)
	if(exclude.find(word)==exclude.end())
//find返回一個迭代器,指向該關(guān)鍵字,若不存在,則返回尾后迭代器
		++word_count[word];
for (const auto& w : word_count)
	cout << w.first << " occurs " << w.second << " 次 " << endl;

關(guān)聯(lián)容器概述

定義關(guān)聯(lián)容器

(1)mutiset使用的例子:

vector<int> v;
for (int i = 0; i != 10; i++)
{
	v.push_back(i);
	v.push_back(i);
}
set<int> is(v.begin(), v.end());
multiset<int> ms(v.begin(), v.end());
cout << is.size() << endl;  //輸出10
cout << ms.size() << endl;  //輸出20
cout << v.size() << endl;   //輸出20

pair類型

創(chuàng)建一個pair時,我們必須提供兩個類型。

pair<string,int> p;

其中兩個成員分別命名為first和second,可以采用成員訪問符訪問他們。

創(chuàng)建pair對象的函數(shù)

有一個函數(shù)需要返回一個pair,我們可以對返回值進行列表初始化

pair<string,int> process(vector<string> &v)
{
    //處理v
    if(!v.empty())
        return { v.back(),v.back().size()}  //列表初始化
    else
        return pair<string,int>(); //隱式構(gòu)造返回值
}

關(guān)聯(lián)容器操作

關(guān)聯(lián)容器迭代器

map<string,int> v;
auto map_it=v.begin()  //獲取一個指向v中一個元素的迭代器
//map_it是指向一個pair<const string,size_t>對象的引用
cout<<map_it->first;  //打印此元素的關(guān)鍵字
cout<<map_it->second  //打印此元素的值

(1)set的迭代器是const的

set的迭代器只允許只讀訪問set中的元素,set中的關(guān)鍵字也是const的,可以用一個set迭代器來讀取元素的值,但不能修改

set<int> s = { 0,1,2,3,4,5,6 };
set<int>::iterator it = s.begin();
if (it != s.end())
{
	*it = 42;  //無法修改
	cout << *it << endl;
}

添加元素

關(guān)聯(lián)容器的insert成員向容器中添加一個元素或一個元素范圍,由于map和set包含不重復的關(guān)鍵字,因此插入一個存在的元素對容器無影響。

vector<int> ivec={2,4,6,8}
set<int> set2;
set2.insert(ivec.begin(),ivec.end())
set2.insert({1,3,5,7})

insert有兩個版本,分別接受一對迭代器,或是一個初始化器列表。

(1)向map添加元素

m.insert({word,1})

(2)insert的返回值

對于不包含重復關(guān)鍵字的容器,添加單一元素的insert版本返回一個pair,pair的first成員是一個迭代器,指向具有給定關(guān)鍵字的元素,second成員是一個bool的值,指出元素是插入成功還是已經(jīng)存在于容器中,如果關(guān)鍵字已在容器中,則insert什么也不做,且返回值中的bool部分為false,若關(guān)鍵字不存在,元素被插入到容器中,且bool值為true。

刪除元素

關(guān)聯(lián)容器定義了三個版本的erase,可傳遞一個迭代器或一個迭代器對來刪除一個元素或一個元素范圍,指定元素被刪除后返回void。

另一個版本沒接收一個key_type參數(shù),此版本刪除所有匹配給定關(guān)鍵字的元素,返回實際刪除的元素數(shù)量。

map的下標操作

map的下標運算符接受一個索引(即關(guān)鍵字),獲取與此關(guān)鍵字相關(guān)聯(lián)的值,若關(guān)鍵字不在map中,則會為其創(chuàng)建一個元素并插入到map中,關(guān)鍵值將進行值初始化。

訪問元素

c.find(k):返回一個迭代器,指向第一個關(guān)鍵字為k的元素,若k不在容器中,則返回尾后迭代器

c.count(k):返回關(guān)鍵字等于k的元素數(shù)量,對于不允許重復關(guān)鍵字的容器,返回值永遠是0或1

關(guān)鍵容器還提供兩個特殊的函數(shù),lower_bound和upper_bound,lower_bound返回的迭代器將指向第一個具有給定關(guān)鍵字的元素,而upper_bound返回的迭代器指向最后一個匹配給定關(guān)鍵的元素之后的位置。

原文鏈接:https://blog.csdn.net/weixin_42375706/article/details/125492448

欄目分類
最近更新