衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++之set/multiset容器

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

1.set/multiset容器簡介

set/multiset容器又稱為關聯式容器,底層是通過二叉樹實現。set/multiset容器在插入數據時就會做排序處理,默認是從小到大的順序。其中set容器允許插入重復數據,multiset則不做此限制。

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

2.set/multiset構造函數和賦值

set容器支持默認構造、有參構造、拷貝構造三種方式。

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

set/multiset是一個關聯式容器,在插入數據時就會自動排序,底層實現原理是二叉樹
set不允許插入重復數據(插入重復數據會忽略)
multiset則可以插入重復數據

set/multiset構造函數
	默認構造:set t;
	有參構造:set(begin,end);
	拷貝構造函數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;
	//插入數據
	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;//等號賦值
	PrintMultiset(mt2);
	
}
int main()
{ 
	test();
	system("pause");
}
wKgZomSyZGGAcYuBAANtACAfiRo987.png

3.set容器設置大小和互換元素


set/multiset大小設置:
	獲取元素個數: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容器設置大小和互換元素

insert()插入元素,可以插入單端數據,也可以插入一個區間數據。

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

clear()清空容器。

set容器插入:
	insert(elem)  -->插入數據elem
	insert(begin,endl)--->插入區間
注意:set容器沒有push_back、push_front函數
set容器刪除:
	erase(elem);//刪除成員,相當于list容器的remove
	erase(begin,end);//刪除區間
	erase(pos);//指定位置刪除
	clear();//清空
#include 
using namespace std;
#include 
class Person
{
public:
	Person(string name, int age) :name(name), age(age) {
	}
	//setr容器由于插入數據時會對數據進行排序,所以需要重載"& 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.查找和統計元素個數

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

count()函數通過成員,返回個數。

set容器查找:
	set::iterator &find(elem)  -->查找成功返回該成員的迭代器,若不存在返回end()
set容器統計
	count(elem)  --->統計elem的個數
#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));//此時auto ret等價于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區別

set和multiset區別:
set不可以插入重復數據,insert插入數據時有返回值。返回類型為隊組pair,該返回值返回的是插入數據的位置迭代器,第二是插入的狀態值;
multiset可以插入重復數據,insert插入數據返回值為插入數據的位置迭代器;,>

#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));//返回當前位置迭代器iterator
	cout ::iterator ptr = mt.begin(); ptr != mt.end(); ptr++)
	{
		cout 
wKgaomSyZu-AaguDAATJkW6bC6Q402.png

7.pair對組使用

對組pair--成對出現的數據,通過隊組可以返回兩個數據
對組創建:
pair p(val,val2);--有參構造
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容器排序規則設置

set容器默認是升序排序,要實現降序排序則需要設置排序規則:提供一個仿函數。

#include 
using namespace std;
#include 
class mycompare
{
public:
	bool operator()(int v1,int v2)const //仿函數,即重載()運算符
	{
		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容器自定義數據排序示例

對自定義數據類型進行數據排序。

#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



審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 字符串
    +關注

    關注

    1

    文章

    585

    瀏覽量

    20603
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62977
  • 容器
    +關注

    關注

    0

    文章

    499

    瀏覽量

    22122
  • C++
    C++
    +關注

    關注

    22

    文章

    2114

    瀏覽量

    73858
收藏 人收藏

    評論

    相關推薦

    c++vector容器

    1.vector容器介紹 ? ? ? 向量(Vector)是一個封裝了動態大小數組的順序容器(Sequence Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對象。可以簡單的認為
    的頭像 發表于 07-13 19:36 ?1503次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>之</b>vector<b class='flag-5'>容器</b>

    c++list容器

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

    C++STL算法(二)

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

    c++STL算法(三)

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

    C++文件操作

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

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

    C++
    電路設計
    發布于 :2023年01月05日 15:49:23

    C++標準庫學習筆記重點

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

    詳細剖析C++的的3種容器

    容器是隨著面向對象語言的誕生而提出的,容器類在面向對象語言中特別重要,甚至它被認為是早期面向對象語言的基礎。在現在幾乎所有的面向對象的語言中也都伴隨著一個容器集,在C++ 中,就是標準
    的頭像 發表于 01-09 12:57 ?5010次閱讀
    詳細剖析<b class='flag-5'>C++</b>的的3種<b class='flag-5'>容器</b>

    C++容器的使用代碼資料總結免費下載

    本文檔的主要內容詳細介紹的是C++容器的使用代碼資料總結免費下載。
    發表于 01-29 10:52 ?3次下載
    <b class='flag-5'>C++</b><b class='flag-5'>容器</b>的使用代碼資料總結免費下載

    C++設計新思維-泛型編程與設計應用

    C++設計新思維-泛型編程與設計應用
    發表于 11-16 15:59 ?3次下載

    什么是set

    set 容器,又稱集合容器,即該容器的底層是以紅黑樹變體實現的,是典型的關聯式容器。這意味著,set
    的頭像 發表于 02-27 15:42 ?1894次閱讀

    C++學習筆記c++的基本認識

    自這篇文章我們即將開始C++的奇幻之旅,其內容主要是讀C++ Primer的總結和筆記,有興趣可以找原版書看看,對于學習C++還是有很大幫助的。這篇文章將從一個經典的程序開始介紹C++
    的頭像 發表于 03-17 13:57 ?767次閱讀

    C++學習筆記順序容器

    C++中的順序容器是一種用于存儲和管理元素序列的數據結構。它們提供了一組有序的元素,并支持在序列的任意位置插入和刪除元素。C++標準庫中提供了多種順序容器,包括vector、deque
    的頭像 發表于 05-11 17:05 ?657次閱讀

    C++入門通用算法

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

    C++之父新作帶你勾勒現代C++地圖

    為了幫助大家解決這些痛點問題,讓大家領略現代C++美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住了,他親自操刀寫就了這本《
    的頭像 發表于 10-30 16:35 ?972次閱讀
    <b class='flag-5'>C++</b>之父新作帶你勾勒現代<b class='flag-5'>C++</b>地圖
    新东泰百家乐的玩法技巧和规则 | 迪士尼百家乐官网的玩法技巧和规则| 百家乐娱乐分析软| 百家乐娱乐网官网网| 大发888开户注册哪家好| 百家乐官网游戏规测| 哪里有百家乐官网游戏下载| 百家乐剁手| 体育博彩| 百家乐官网怎么发牌| 游戏百家乐押金| 积石山| 同乐城百家乐官网娱乐城| 博必发百家乐的玩法技巧和规则| 林州市| 优惠搏百家乐官网的玩法技巧和规则| 百家乐这样赢保单分析 | 百家乐翻天粤语| 百家乐官网技巧之写路| 凯旋门百家乐官网技巧| 网络百家乐的陷阱| 高额德州扑克第七季| A8百家乐官网娱乐平台| 百家乐斗地主| SHOW| 百家乐平台下载| 网上澳门| 百家乐官网操作技巧| 大发888游戏攻略| 玩百家乐官网输澳门百家乐官网现场 | 鼎尚百家乐官网的玩法技巧和规则 | 至尊百家乐官网娱乐场| 太原百家乐的玩法技巧和规则 | 娱乐城送18| 娱乐百家乐官网的玩法技巧和规则| 威尼斯人娱乐场 新世纪| 玩百家乐官网是否有技巧| 百家乐怎么才能包赢| 百家乐官网单双打法| 澳门百家乐开户投注| 御金娱乐|