0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++之set/multiset容器

wang123a ? 來源:wang123a ? 作者:wang123a ? 2023-07-17 09:43 ? 次閱讀

1.set/multiset容器簡(jiǎn)介

set/multiset容器又稱為關(guān)聯(lián)式容器,底層是通過二叉樹實(shí)現(xiàn)。set/multiset容器在插入數(shù)據(jù)時(shí)就會(huì)做排序處理,默認(rèn)是從小到大的順序。其中set容器允許插入重復(fù)數(shù)據(jù),multiset則不做此限制。

在前面介紹的string(字符串)、vector(單端數(shù)組)、deque(雙端數(shù)組)、statck(棧)、queue(隊(duì)列)、list(鏈表)都屬于順序容器。而set/multiset則是數(shù)組關(guān)聯(lián)式容器。

2.set/multiset構(gòu)造函數(shù)和賦值

set容器支持默認(rèn)構(gòu)造、有參構(gòu)造、拷貝構(gòu)造三種方式。

set容器插入數(shù)據(jù)使用insert()函數(shù)。

set/multiset是一個(gè)關(guān)聯(lián)式容器,在插入數(shù)據(jù)時(shí)就會(huì)自動(dòng)排序,底層實(shí)現(xiàn)原理是二叉樹
set不允許插入重復(fù)數(shù)據(jù)(插入重復(fù)數(shù)據(jù)會(huì)忽略)
multiset則可以插入重復(fù)數(shù)據(jù)

set/multiset構(gòu)造函數(shù)
	默認(rèn)構(gòu)造:set t;
	有參構(gòu)造:set(begin,end);
	拷貝構(gòu)造函數(shù)set(const set &p);
set/multiset賦值:
	重載=: set &operator=(const set &p);
#include 
using namespace std;
#include 
void PrintSet(const set& p)
{
	for (set::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{	
		cout & p)
{
	for (multiset::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout  t1;
	//插入數(shù)據(jù)
	t1.insert(10);
	t1.insert(5);
	t1.insert(7);
	t1.insert(8);
	t1.insert(10);
	PrintSet(t1);
	cout t2(t1.begin(), t1.end());
	PrintSet(t2);
	cout t3(t2);
	PrintSet(t3);

	multisetmt1;
	mt1.insert(10);
	mt1.insert(5);
	mt1.insert(7);
	mt1.insert(8);
	mt1.insert(10);
	cout mt2 = mt1;//等號(hào)賦值
	PrintMultiset(mt2);
	
}
int main()
{ 
	test();
	system("pause");
}
wKgZomSyZGGAcYuBAANtACAfiRo987.png

3.set容器設(shè)置大小和互換元素


set/multiset大小設(shè)置:
	獲取元素個(gè)數(shù):size()
	判斷容器是否為空empty();
	互換元素:swap()

#include 
using namespace std;
#include 
#if 1
void PrintSet(const set& p)
{
	for (set::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout  t1;
	for (int i = 0; i < 5; i++)
	{
		int temp = rand() % 100;
		t1.insert(temp);
	}
	cout  t2;
	if (t2.empty())
	{
		cout t3;
	t3.swap(t2);
	cout 
wKgaomSyZMmAIPwcAAQ6UpWmRZs135.png

4.set容器設(shè)置大小和互換元素

insert()插入元素,可以插入單端數(shù)據(jù),也可以插入一個(gè)區(qū)間數(shù)據(jù)。

erase()刪除元素,可以指定位置刪除,可以刪除所以相同的元素,也可以刪除一個(gè)區(qū)間范圍。

clear()清空容器。

set容器插入:
	insert(elem)  -->插入數(shù)據(jù)elem
	insert(begin,endl)--->插入?yún)^(qū)間
注意:set容器沒有push_back、push_front函數(shù)
set容器刪除:
	erase(elem);//刪除成員,相當(dāng)于list容器的remove
	erase(begin,end);//刪除區(qū)間
	erase(pos);//指定位置刪除
	clear();//清空
#include 
using namespace std;
#include 
class Person
{
public:
	Person(string name, int age) :name(name), age(age) {
	}
	//setr容器由于插入數(shù)據(jù)時(shí)會(huì)對(duì)數(shù)據(jù)進(jìn)行排序,所以需要重載"& p)
{
	for (set::iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout  t1;
	t1.insert(Person("小王",18));
	t1.insert(Person("小李", 18));
	t1.insert(Person("小李", 19));
	t1.insert(Person("小王", 18));
	PrintSet(t1);
	sett2;
	t2.insert(t1.begin(), t1.end());
	cout 
wKgZomSyZZeAfMTiAAS7catRMzQ171.png

5.查找和統(tǒng)計(jì)元素個(gè)數(shù)

find()函數(shù)查找元素,查找沖個(gè)返回該元素的位置迭代器,失敗返回end;

count()函數(shù)通過成員,返回個(gè)數(shù)。

set容器查找:
	set::iterator &find(elem)  -->查找成功返回該成員的迭代器,若不存在返回end()
set容器統(tǒng)計(jì)
	count(elem)  --->統(tǒng)計(jì)elem的個(gè)數(shù)
#include 
using namespace std;
#include 
class Person
{
public:
	Person(string name, int age) :name(name), age(age) {

	}
	bool operator& t)
{
	for (set::iterator ptr = t.begin(); ptr != t.end(); ptr++)
	{
		cout  t1;
	t1.insert(Person("小王", 18));
	t1.insert(Person("小李", 18));
	t1.insert(Person("小李", 19));
	t1.insert(Person("小王", 18));
	PrintSet(t1);
	
	auto ret= t1.find(Person("小李", 19));//此時(shí)auto ret等價(jià)于set::iterator ret;
	if (ret != t1.end())
	{
		cout ::iterator ptr = t.begin(); ptr != t.end(); ptr++)
	{
		cout  mt;
	mt.insert(Person("小王", 18));
	mt.insert(Person("小李", 18));
	mt.insert(Person("小李", 19));
	mt.insert(Person("小王", 18));
	PrintMultiset(mt);
	cout 
wKgZomSyZlCAGEUXAATxDQkkc6w160.png

6.set和multiset區(qū)別

set和multiset區(qū)別:
set不可以插入重復(fù)數(shù)據(jù),insert插入數(shù)據(jù)時(shí)有返回值。返回類型為隊(duì)組pair,該返回值返回的是插入數(shù)據(jù)的位置迭代器,第二是插入的狀態(tài)值;
multiset可以插入重復(fù)數(shù)據(jù),insert插入數(shù)據(jù)返回值為插入數(shù)據(jù)的位置迭代器;,>

#include 
using namespace std;
#include 
#if 0
class Person
{
public:
	Person(string name, int age) :name(name), age(age) {

	}
	bool operator& p)
{
	for (set::iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout  t1;
	pair ::iterator, bool> ret=t1.insert(Person("小王", 18));
	if (ret.second)
	{
		cout  mt;
	auto point=mt.insert(Person("小王", 18));//返回當(dāng)前位置迭代器iterator
	cout ::iterator ptr = mt.begin(); ptr != mt.end(); ptr++)
	{
		cout 
wKgaomSyZu-AaguDAATJkW6bC6Q402.png

7.pair對(duì)組使用

對(duì)組pair--成對(duì)出現(xiàn)的數(shù)據(jù),通過隊(duì)組可以返回兩個(gè)數(shù)據(jù)
對(duì)組創(chuàng)建:
pair p(val,val2);--有參構(gòu)造
pairp=make_pair(val,val2),type>,type>

#include 
using namespace std;
void test()
{
	pair p("小王", 18);
	cout p2 = make_pair("小李", 26);
	cout 
wKgaomSyZ2uAZJm9AANvHTUhop4769.png

8.set容器排序規(guī)則設(shè)置

set容器默認(rèn)是升序排序,要實(shí)現(xiàn)降序排序則需要設(shè)置排序規(guī)則:提供一個(gè)仿函數(shù)。

#include 
using namespace std;
#include 
class mycompare
{
public:
	bool operator()(int v1,int v2)const //仿函數(shù),即重載()運(yùn)算符
	{
		return v1 > v2;
	}
};
void test()
{
	sett1;
	t1.insert(20);
	t1.insert(10);
	t1.insert(40);
	t1.insert(30);
	t1.insert(5);
	cout ::iterator ptr = t1.begin();ptr != t1.end(); ptr++)
	{
		cout t2;
	t2.insert(20);
	t2.insert(10);
	t2.insert(40);
	t2.insert(30);
	cout ::iterator ptr = t2.begin(); ptr != t2.end(); ptr++)
	{
		cout 
wKgZomSyaAqAI02oAANBHHL0m84982.png

9.set容器自定義數(shù)據(jù)排序示例

對(duì)自定義數(shù)據(jù)類型進(jìn)行數(shù)據(jù)排序。

#include 
using namespace std;
#include 
class Person
{
	friend class mycompare;//定義為友元類
	friend ostream& operator p2.age;
	}
};
void PrintSet(sett)
{
	for (set::iterator ptr = t.begin(); ptr != t.end(); ptr++)
	{
		cout t1;
	t1.insert(Person("小王", 18));
	t1.insert(Person("小李", 18));
	t1.insert(Person("小李", 19));
	t1.insert(Person("小王", 18));
	PrintSet(t1);

}
int main()
{
	test();
	system("pause");
}
wKgaomSyaHaAUuRzAALtsANwS3c248.png



審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    566

    瀏覽量

    20384
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61969
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    490

    瀏覽量

    21986
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2085

    瀏覽量

    73302
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    c++vector容器

    1.vector容器介紹 ? ? ? 向量(Vector)是一個(gè)封裝了動(dòng)態(tài)大小數(shù)組的順序容器(Sequence Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對(duì)象??梢院?jiǎn)單的認(rèn)為
    的頭像 發(fā)表于 07-13 19:36 ?1285次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>之</b>vector<b class='flag-5'>容器</b>

    c++list容器

    list是序列容器,允許在序列中的任何位置執(zhí)行固定O(1)時(shí)間復(fù)雜度的插入和刪除操作,并在兩個(gè)方向進(jìn)行迭代。list容器是一個(gè)雙向循環(huán)鏈表。
    的頭像 發(fā)表于 07-15 08:53 ?1177次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>之</b>list<b class='flag-5'>容器</b>

    C++STL算法(二)

    C++STL算法(二)
    的頭像 發(fā)表于 07-18 14:49 ?857次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>STL算法(二)

    c++STL算法(三)

    c++STL算法(三)
    的頭像 發(fā)表于 07-18 15:00 ?1074次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>之</b>STL算法(三)

    C++文件操作

    C++文件操作
    的頭像 發(fā)表于 07-21 10:52 ?1020次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>文件操作

    C++力扣刷題記盛最多的水容器,讓我們從C++做題到放棄

    C++
    電路設(shè)計(jì)
    發(fā)布于 :2023年01月05日 15:49:23

    C++標(biāo)準(zhǔn)庫(kù)學(xué)習(xí)筆記重點(diǎn)

    查找一個(gè)帶某特定值的元素,其速度可能快過關(guān)聯(lián)式容器。 unordered set、unordered multiset、unordered map、unordered multimap31.
    發(fā)表于 10-23 20:28

    詳細(xì)剖析C++的的3種容器

    容器是隨著面向?qū)ο笳Z言的誕生而提出的,容器類在面向?qū)ο笳Z言中特別重要,甚至它被認(rèn)為是早期面向?qū)ο笳Z言的基礎(chǔ)。在現(xiàn)在幾乎所有的面向?qū)ο蟮恼Z言中也都伴隨著一個(gè)容器集,在C++ 中,就是標(biāo)準(zhǔn)
    的頭像 發(fā)表于 01-09 12:57 ?4830次閱讀
    詳細(xì)剖析<b class='flag-5'>C++</b>的的3種<b class='flag-5'>容器</b>

    C++容器的使用代碼資料總結(jié)免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C++容器的使用代碼資料總結(jié)免費(fèi)下載。
    發(fā)表于 01-29 10:52 ?2次下載
    <b class='flag-5'>C++</b><b class='flag-5'>容器</b>的使用代碼資料總結(jié)免費(fèi)下載

    C++設(shè)計(jì)新思維-泛型編程與設(shè)計(jì)應(yīng)用

    C++設(shè)計(jì)新思維-泛型編程與設(shè)計(jì)應(yīng)用
    發(fā)表于 11-16 15:59 ?3次下載

    什么是set?

    set 容器,又稱集合容器,即該容器的底層是以紅黑樹變體實(shí)現(xiàn)的,是典型的關(guān)聯(lián)式容器。這意味著,set
    的頭像 發(fā)表于 02-27 15:42 ?1545次閱讀

    C++學(xué)習(xí)筆記c++的基本認(rèn)識(shí)

    自這篇文章我們即將開始C++的奇幻之旅,其內(nèi)容主要是讀C++ Primer的總結(jié)和筆記,有興趣可以找原版書看看,對(duì)于學(xué)習(xí)C++還是有很大幫助的。這篇文章將從一個(gè)經(jīng)典的程序開始介紹C++
    的頭像 發(fā)表于 03-17 13:57 ?627次閱讀

    C++學(xué)習(xí)筆記順序容器

    C++中的順序容器是一種用于存儲(chǔ)和管理元素序列的數(shù)據(jù)結(jié)構(gòu)。它們提供了一組有序的元素,并支持在序列的任意位置插入和刪除元素。C++標(biāo)準(zhǔn)庫(kù)中提供了多種順序容器,包括vector、deque
    的頭像 發(fā)表于 05-11 17:05 ?506次閱讀

    C++入門通用算法

    C++ 是一種強(qiáng)大的編程語言,它提供了許多通用算法,可以用于各種容器類型。這些算法是通過迭代器來操作容器中的元素,因此它們是通用的,可以用于不同類型的容器。在本篇博客中,我們將詳細(xì)介紹
    的頭像 發(fā)表于 05-17 09:40 ?570次閱讀

    C++之父新作帶你勾勒現(xiàn)代C++地圖

    為了幫助大家解決這些痛點(diǎn)問題,讓大家領(lǐng)略現(xiàn)代C++美,掌握其中的精髓,更好地使用C++,C++之父Bjarne Stroustrup坐不住了,他親自操刀寫就了這本《
    的頭像 發(fā)表于 10-30 16:35 ?697次閱讀
    <b class='flag-5'>C++</b>之父新作帶你勾勒現(xiàn)代<b class='flag-5'>C++</b>地圖