溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中map和set如何使用

發(fā)布時間:2023-02-22 11:13:33 來源:億速云 閱讀:103 作者:iii 欄目:開發(fā)技術

這篇文章主要介紹了C++中map和set如何使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++中map和set如何使用文章都會有所收獲,下面我們一起來看看吧。

    一、set

    1.1 set的介紹

    C++中map和set如何使用

    首先要知道set的底層是由紅黑樹(平衡二叉搜索樹)實現的。

    T set存放元素類型,底層是<value, value>的鍵值對。
    Compare 仿函數,因為實現搜索樹需要比較。

    1.2 set的使用

    1.2.1 set的構造
    void test_set()
    {
    	// 默認構造
    	set<int> s1;
    	// 迭代器區(qū)間構造
    	int a[] = { 1, 2, 3, 4 };
    	set<int> s2(a, a + 4);
    	// 拷貝構造(深拷貝)
    	set<int> s3(s2);
    
    	for (int e : s2) cout << e << " ";
    	cout << endl;
    	for (int e : s3) cout << e << " ";
    	cout << endl;
    }

    C++中map和set如何使用

    1.2.2 set的迭代器

    C++中map和set如何使用

    可以看到set有反向迭代器。

    void test1()
    {
    	set<int> s;// 排序+去重
    	s.insert(1);
    	s.insert(2);
    	s.insert(3);
    	s.insert(1);
    	s.insert(3);
    	s.insert(4);
    	// 正向迭代器
    	set<int>::iterator it1 = s.begin();
    	while (it1 != s.end())
    	{
    		cout << *it1++ << " ";
    	}
    	cout << endl;
    	// 反向迭代器
    	set<int>::reverse_iterator it2 = s.rbegin();
    	while (it2 != s.rend())
    	{
    		cout << *it2++ << " ";
    	}
    	cout << endl;
    }

    C++中map和set如何使用

    因為set的仿函數默認參數是less<T>,所以排的是升序,如果我們想排降序就可以傳遞greater<T>。

    void test1()
    {
    	set<int, greater<int>> s;// 排序+去重
    	s.insert(1);
    	s.insert(2);
    	s.insert(3);
    	s.insert(1);
    	s.insert(3);
    	s.insert(4);
    	// 正向迭代器
    	set<int>::iterator it1 = s.begin();
    	while (it1 != s.end())
    	{
    		cout << *it1++ << " ";
    	}
    	cout << endl;
    	// 反向迭代器
    	set<int>::reverse_iterator it2 = s.rbegin();
    	while (it2 != s.rend())
    	{
    		cout << *it2++ << " ";
    	}
    	cout << endl;
    }

    C++中map和set如何使用

    1.2.3 set的修改

    1.2.3.1 insert && find && erase

    C++中map和set如何使用

    C++中map和set如何使用

    C++中map和set如何使用

    void test2()
    {
    	set<int> s;
    	s.insert(1);
    	s.insert(2);
    	s.insert(3);
    	s.insert(4);
    	s.insert(5);
    	set<int>::iterator it = s.find(3);
    	s.erase(it);
    	for (auto& e : s)
    	{
    		cout << e << " ";
    	}
    	cout << endl;
    }

    C++中map和set如何使用

    1.2.3.2 count

    C++中map和set如何使用

    傳進去一個元素數值,返回該元素的個數

    void test2()
    {
    	set<int> s;
    	s.insert(1);
    	s.insert(2);
    	s.insert(3);
    	s.insert(4);
    	s.insert(5);
    	cout << s.count(2) << endl;
    	cout << s.count(6) << endl;
    }

    C++中map和set如何使用

    因為set的元素是唯一的,所以在set這里count可以用find來代替,但是在后面的multiset可以插入重復的元素,count就可以統(tǒng)計該元素的個數。

    1.3 multiset

    multiset和set的區(qū)別是它可以插入重復的元素。其他的接口跟set一致。頭文件也跟set相同。

    void test3()
    {
    	multiset<int> ms;
    	ms.insert(1);
    	ms.insert(1);
    	ms.insert(2);
    	ms.insert(3);
    	ms.insert(4);
    	for (auto& e : ms)
    	{
    		cout << e << " ";
    	}
    	cout << endl;
    	cout << "count(1): " << ms.count(1) << endl;
    }

    C++中map和set如何使用

    另外使用find查找時,如果有多個值相同,find返回的值是中序的第一個。

    C++中map和set如何使用

    二、map

    2.1 map的介紹

    C++中map和set如何使用

    key 鍵值對中key的類型
    T 鍵值對中value的類型

    注意:

    1?? map中的元素總是按照鍵值key進行比較排序的。
    2?? map支持下標訪問符,即在[]中放入key,就可以找到與key對應的value。

    2.2 map的使用

    構造和迭代器跟上面的set類似,就不過多闡述。

    2.2.1 map的修改

    2.2.1.1 insert

    C++中map和set如何使用

    void test4()
    {
    	map<string, int> m;
    	m.insert(pair<string, int>("a", 1));// 匿名對象
    	m.insert(make_pair("b", 2));// 簡化寫法
    	m.insert(make_pair("c", 2));
    	m.insert(make_pair("d", 2));
    	map<string, int>::iterator it = m.begin();
    	while (it != m.end())
    	{
    		cout << (*it).first << "->" << (*it).second << endl;
    		it++;
    	}
    }

    C++中map和set如何使用

    make_pair:函數模板,不需要像pair一樣顯示聲明類型,而是通過傳參自動推導。

    C++中map和set如何使用

    2.2.1.2 統(tǒng)計次數

    1?? 使用find,利用迭代器

    int main()
    {
    	string arr[] = { "北京", "武漢", "廣州", "上海", "北京", "北京", "廣州",
    	"上海", "上海" };
    	map<string, int> cnt;
    	for (auto& e : arr)
    	{
    		map<string, int>::iterator fd = cnt.find(e);
    		if (fd == cnt.end())
    		{
    			cnt.insert(make_pair(e, 1));
    		}
    		else
    		{
    			fd->second++;
    		}
    	}
    	for (auto& e : cnt)
    	{
    		cout << e.first << "->" << e.second << endl;
    	}
    	return 0;
    }

    C++中map和set如何使用

    2?? 使用[]

    int main()
    {
    	string arr[] = { "北京", "武漢", "廣州", "上海", "北京", "北京", "廣州",
    	"上海", "上海" };
    	map<string, int> cnt;
    	for (auto& e : arr)
    	{
    		cnt[e]++;
    	}
    	for (auto& e : cnt)
    	{
    		cout << e.first << "->" << e.second << endl;
    	}
    	return 0;
    }

    C++中map和set如何使用

    [] 可以用來插入、修改、查找

    [] -> (*((this->insert(make_pair(k,mapped_type()))).first)).second
    // 等價于
    V& operator[](const K& k)
    {
    	pair<iterator, bool> ret = insert(make_pair(k, V()));
    	return ret.first->second;
    }

    這里就可以看出使用[]的時候要注意:如果沒有它會直接插入。

    所以我們想插入就可以:

    int main()
    {
    	map<string, int> m;
    	// 插入
    	m["廣西"];
    	m["廣東"] = 1;
    	for (auto& e : m)
    	{
    		cout << e.first << "->" << e.second << endl;
    	}
    	return 0;
    }

    C++中map和set如何使用

    當我們想要修改的時候不能用insert,因為只要key相同就會插入失敗。

    int main()
    {
    	map<string, int> m;
    	// 插入
    	m["廣西"];
    	m["廣東"] = 1;
    	m.insert(make_pair("廣東", 2));// 插入失敗
    	for (auto& e : m)
    	{
    		cout << e.first << "->" << e.second << endl;
    	}
    	return 0;
    }

    C++中map和set如何使用

    先要修改可以:

    m["廣東"] = 2;

    key不在就是插入,key在就是查找。

    2.3 multimap

    int main()
    {
    	multimap<string, int> mm;
    	mm.insert(make_pair("北京", 1));
    	mm.insert(make_pair("北京", 2));
    	mm.insert(make_pair("北京", 1));
    	mm.insert(make_pair("上海", 1));
    	for (auto& e : mm)
    	{
    		cout << e.first << "->" << e.second << endl;
    	}
    	return 0;
    }

    multimap容器與map容器的底層實現以及成員函數的接口都是基本一致,而multimap的key可以重復。注意multimap沒有[]

    C++中map和set如何使用

    使用multimap統(tǒng)計次數:

    int main()
    {
    	multimap<string, int> mm;
    	string arr[] = { "北京", "武漢", "廣州", "上海", "北京", "北京", "廣州",
    	"上海", "上海" };
    	for (auto& e : arr)
    	{
    		map<string, int>::iterator fd = mm.find(e);
    		if (fd == mm.end())
    		{
    			mm.insert(make_pair(e, 1));
    		}
    		else
    		{
    			fd->second++;
    		}
    	}
    	for (auto& e : mm)
    	{
    		cout << e.first << "->" << e.second << endl;
    	}
    	return 0;
    }

    C++中map和set如何使用

    補充:set和map的區(qū)別

    • map中的元素是key-value(關鍵字&mdash;值)對:關鍵字起到索引的作用,值則表示與索引相關聯(lián)的數據;Set與之相對就是關鍵字的簡單集合,set中每個元素只包含一個關鍵字。

    • set的迭代器是const的,不允許修改元素的值。map允許修改value,但不允許修改key。其原因是因為map和set是根據關鍵字排序來保證其有序性的,如果允許修改key的話,那么首先需要刪除該鍵,然后調節(jié)平衡,再插入修改后的鍵值,調節(jié)平衡,如此一來,嚴重破壞了map和set的結構,導致iterator失效,不知道應該指向改變前的位置,還是指向改變后的位置。所以STL中將set的迭代器設置成const,不允許修改迭代器的值;而map的迭代器則不允許修改key值,允許修改value值。

    • map支持下標操作,set不支持下標操作。map可以用key做下標,map的下標運算符[ ]將關鍵碼作為下標去執(zhí)行查找,如果關鍵碼不存在,則插入一個具有該關鍵碼和mapped_type類型默認值的元素至map中,因此下標運算符[ ]在map應用中需要慎用,const_map不能用,只希望確定某一個關鍵值是否存在而不希望插入元素時也不應該使用,mapped_type類型沒有默認值也不應該使用。如果find能解決需要,盡可能用find。

    關于“C++中map和set如何使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++中map和set如何使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI