最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中set/multiset容器詳解(附測試用例與結(jié)果圖)

 更新時(shí)間:2023年02月09日 14:19:48   作者:努力學(xué)習(xí)的小馬  
set/multiset屬于關(guān)聯(lián)式容器,底層結(jié)構(gòu)是用二叉樹實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于C++中set/multiset容器的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

1 set/ multiset 容器

1.1 set基本概念

簡介:

  • 所有元素都會在插入時(shí)自動被排序

本質(zhì):

  • set/multiset屬于關(guān)聯(lián)式容器,底層結(jié)構(gòu)是用二叉樹實(shí)現(xiàn)。

set和multiset區(qū)別

  • set不允許容器中有重復(fù)的元素
  • multiset允許容器中有重復(fù)的元素

1.2 set構(gòu)造和賦值

功能描述:創(chuàng)建set容器以及賦值

構(gòu)造:

  • set<T> st; //默認(rèn)構(gòu)造函數(shù):
  • set(const set &st); //拷貝構(gòu)造函數(shù)

賦值:

  • set& operator=(const set &st); //重載等號操作符

示例:

#include <set>

void printSet(set<int> & s)
{
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//構(gòu)造和賦值
void test01()
{
	set<int> s1;

	s1.insert(10);
	s1.insert(30);
	s1.insert(20);
	s1.insert(40);
	printSet(s1);

	//拷貝構(gòu)造
	set<int>s2(s1);
	printSet(s2);

	//賦值
	set<int>s3;
	s3 = s2;
	printSet(s3);
}

int main() {

	test01();

	system("pause");

	return 0;
}

總結(jié):

  • set容器插入數(shù)據(jù)時(shí)用insert
  • set容器插入數(shù)據(jù)的數(shù)據(jù)會自動排序

1.3 set大小和交換

功能描述:

統(tǒng)計(jì)set容器大小以及交換set容器

函數(shù)原型:

  • size(); //返回容器中元素的數(shù)目
  • empty(); //判斷容器是否為空
  • swap(st); //交換兩個(gè)集合容器

示例:

void printSet(set<int> & s)
{
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//大小
void test01()
{

	set<int> s1;

	s1.insert(10);
	s1.insert(30);
	s1.insert(20);
	s1.insert(40);

	if (s1.empty())
	{
		cout << "s1為空" << endl;
	}
	else
	{
		cout << "s1不為空" << endl;
		cout << "s1的大小為: " << s1.size() << endl;
		cout << endl;
	}

}

//交換
void test02()
{
	set<int> s1;

	s1.insert(10);
	s1.insert(30);
	s1.insert(20);
	s1.insert(40);

	set<int> s2;

	s2.insert(100);
	s2.insert(300);
	s2.insert(200);
	s2.insert(400);

	cout << "交換前" << endl;
	printSet(s1);
	printSet(s2);
	cout << endl;

	cout << "交換后" << endl;
	s1.swap(s2);
	printSet(s1);
	printSet(s2);
}

int main() {

	test01();

	test02();

	system("pause");

	return 0;
}

總結(jié):

  • 統(tǒng)計(jì)大小 — size
  • 判斷是否為空 — empty
  • 交換容器 — swap

1.4 set插入和刪除

功能描述:

set容器進(jìn)行插入數(shù)據(jù)和刪除數(shù)據(jù)

函數(shù)原型:

  • insert(elem); //在容器中插入元素。
  • clear(); //清除所有元素
  • erase(pos); //刪除pos迭代器所指的元素,返回下一個(gè)元素的迭代器。
  • erase(beg, end); //刪除區(qū)間[beg,end)的所有元素 ,返回下一個(gè)元素的迭代器。
  • erase(elem); //刪除容器中值為elem的元素。

示例:

#include <set>

void printSet(set<int> & s)
{
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//插入和刪除
void test01()
{
	set<int> s1;
	//插入
	s1.insert(10);
	s1.insert(30);
	s1.insert(20);
	s1.insert(40);
	printSet(s1);

	//刪除
	s1.erase(s1.begin());
	printSet(s1);

	s1.erase(30);
	printSet(s1);

	//清空
	//s1.erase(s1.begin(), s1.end());
	s1.clear();
	printSet(s1);
}

int main() {

	test01();

	system("pause");

	return 0;
}

總結(jié):

  • 插入 — insert
  • 刪除 — erase
  • 清空 — clear

1.5 set查找和統(tǒng)計(jì)

功能描述:

對set容器進(jìn)行查找數(shù)據(jù)以及統(tǒng)計(jì)數(shù)據(jù)

函數(shù)原型:

  • find(key); //查找key是否存在,若存在,返回該鍵的元素的迭代器;若不存在,返回set.end();
  • count(key); //統(tǒng)計(jì)key的元素個(gè)數(shù)

示例:

#include <set>

//查找和統(tǒng)計(jì)
void test01()
{
	set<int> s1;
	//插入
	s1.insert(10);
	s1.insert(30);
	s1.insert(20);
	s1.insert(40);
	
	//查找
	set<int>::iterator pos = s1.find(30);

	if (pos != s1.end())
	{
		cout << "找到了元素 : " << *pos << endl;
	}
	else
	{
		cout << "未找到元素" << endl;
	}

	//統(tǒng)計(jì)
	int num = s1.count(30);
	cout << "num = " << num << endl;
}

int main() {

	test01();

	system("pause");

	return 0;
}

總結(jié):

  • 查找 — find (返回的是迭代器)
  • 統(tǒng)計(jì) — count (對于set,結(jié)果為0或者1)

1.6 set和multiset區(qū)別

學(xué)習(xí)目標(biāo):

掌握set和multiset的區(qū)別

區(qū)別:

  • set不可以插入重復(fù)數(shù)據(jù),而multiset可以
  • set插入數(shù)據(jù)的同時(shí)會返回插入結(jié)果,表示插入是否成功
  • multiset不會檢測數(shù)據(jù),因此可以插入重復(fù)數(shù)據(jù)

第7行的pair<set<int>::iterator, bool>是怎么來的呢?首先將鼠標(biāo)停留在第七行的insert上,點(diǎn)擊鼠標(biāo)右鍵,選擇轉(zhuǎn)到定義,會發(fā)現(xiàn)insert函數(shù)的返回類型是_Pairib,如下圖

圖一

再將鼠標(biāo)停留在_Pairib上,點(diǎn)擊鼠標(biāo)右鍵,選擇轉(zhuǎn)到定義,就會發(fā)現(xiàn)_Pairib是pair,里面有兩個(gè)數(shù)據(jù),第一個(gè)數(shù)據(jù)是迭代器

示例:

#include <set>

//set和multiset區(qū)別
void test01()
{
	set<int> s;
	pair<set<int>::iterator, bool>  ret = s.insert(10);
	if (ret.second) {
		cout << "第一次插入成功!" << endl;
	}
	else {
		cout << "第一次插入失敗!" << endl;
	}

	ret = s.insert(10);
	if (ret.second) {
		cout << "第二次插入成功!" << endl;
	}
	else {
		cout << "第二次插入失敗!" << endl;
	}
    
	//multiset
	multiset<int> ms;
	ms.insert(10);
	ms.insert(10);

	for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

int main() {

	test01();

	system("pause");

	return 0;
}

總結(jié):

  • 如果不允許插入重復(fù)數(shù)據(jù)可以利用set
  • 如果需要插入重復(fù)數(shù)據(jù)利用multiset

1.7 set容器排序

學(xué)習(xí)目標(biāo):

  • set容器默認(rèn)排序規(guī)則為從小到大,掌握如何改變排序規(guī)則

主要技術(shù)點(diǎn):

  • 利用仿函數(shù)(重載了運(yùn)算符或小括號),可以改變排序規(guī)則

示例一: set存放內(nèi)置數(shù)據(jù)類型

如果你想要set中的元素按自己想要的順序進(jìn)行排序,那么就要在沒有插入元素前告訴set排序規(guī)則

#include <set>

class MyCompare //不一定非要是MyCompare,隨便命名
{
public:

	//第一個(gè)()代表重載小括號,第二個(gè)()代表函數(shù)的參數(shù)列表
	bool operator()(int v1, int v2) {

		//降序,也就是想要第一個(gè)數(shù)大于第二個(gè)數(shù)
		return v1 > v2;
	}
};
void test01() 
{    
	set<int> s1;
	s1.insert(10);
	s1.insert(40);
	s1.insert(20);
	s1.insert(30);
	s1.insert(50);

	//默認(rèn)從小到大
	for (set<int>::iterator it = s1.begin(); it != s1.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;

	//指定排序規(guī)則,<>肯定是放數(shù)據(jù)類型,不能放函數(shù)名,而仿函數(shù)Mycompare本質(zhì)上就是一個(gè)類型
	//插入數(shù)之后就沒辦法排序了,插入之前就要指定排序規(guī)則
	set<int,MyCompare> s2;
	s2.insert(10);
	s2.insert(40);
	s2.insert(20);
	s2.insert(30);
	s2.insert(50);

	for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

int main() {

	test01();

	system("pause");

	return 0;
}

示例二: set存放自定義數(shù)據(jù)類型

#include <set>
#include <string>

class Person
{
public:
	Person(string name, int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}

	string m_Name;
	int m_Age;

};
class comparePerson
{
public:
	bool operator()(const Person& p1, const Person &p2)
	{
		//按照年齡進(jìn)行排序  降序
		return p1.m_Age > p2.m_Age;
	}
};

void test01()
{
	set<Person, comparePerson> s;

	Person p1("劉備", 23);
	Person p2("關(guān)羽", 27);
	Person p3("張飛", 25);
	Person p4("趙云", 21);

	s.insert(p1);
	s.insert(p2);
	s.insert(p3);
	s.insert(p4);

	for (set<Person, comparePerson>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << "姓名: " << it->m_Name << " 年齡: " << it->m_Age << endl;
	}
}
int main() {

	test01();

	system("pause");

	return 0;
}

總結(jié)

到此這篇關(guān)于C++中set/multiset容器詳解的文章就介紹到這了,更多相關(guān)C++ set/multiset容器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深度探究C++中的函數(shù)重載的用法

    深度探究C++中的函數(shù)重載的用法

    這篇文章主要介紹了C++中的函數(shù)重載用法,包括重載時(shí)參數(shù)類型的差異以及匹配和轉(zhuǎn)換等方面問題的講解,需要的朋友可以參考下
    2016-01-01
  • C++ STL vector的模擬實(shí)現(xiàn)

    C++ STL vector的模擬實(shí)現(xiàn)

    這篇文章主要介紹了C++ STL vector的模擬實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 對比C語言中memccpy()函數(shù)和memcpy()函數(shù)的用法

    對比C語言中memccpy()函數(shù)和memcpy()函數(shù)的用法

    這篇文章主要介紹了對比C語言中memccpy()函數(shù)和memcpy()函數(shù)的用法,二者都是用于復(fù)制內(nèi)存內(nèi)容,注意區(qū)別,需要的朋友可以參考下
    2015-08-08
  • Visual Studio Code運(yùn)行程序時(shí)輸出中文成亂碼問題及解決方法

    Visual Studio Code運(yùn)行程序時(shí)輸出中文成亂碼問題及解決方法

    這篇文章主要介紹了解決Visual Studio Code運(yùn)行程序時(shí)輸出中文成亂碼問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 舉例講解C語言程序中對二叉樹數(shù)據(jù)結(jié)構(gòu)的各種遍歷方式

    舉例講解C語言程序中對二叉樹數(shù)據(jù)結(jié)構(gòu)的各種遍歷方式

    這篇文章主要介紹了舉例講解C語言程序中對二叉樹數(shù)據(jù)結(jié)構(gòu)的各種遍歷方式,先序中序后序二叉樹遍歷幾乎成了最老生常談的數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識,的朋友可以參考下
    2016-04-04
  • 矩陣的行主序與列主序的分析

    矩陣的行主序與列主序的分析

    這篇文章主要介紹了矩陣的行主序與列主序的分析的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C++構(gòu)造和解析Json的使用示例

    C++構(gòu)造和解析Json的使用示例

    今天小編就為大家分享一篇關(guān)于C++構(gòu)造和解析Json的使用示例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 通過代碼實(shí)例解析c++ vector常用方法

    通過代碼實(shí)例解析c++ vector常用方法

    這篇文章主要介紹了通過代碼實(shí)例解析c++ vector常用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • VS配置好Qt環(huán)境之后但無法打開ui界面的問題解決

    VS配置好Qt環(huán)境之后但無法打開ui界面的問題解決

    本文主要介紹了VS配置好Qt環(huán)境之后但無法打開ui界面的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06
  • C++實(shí)現(xiàn)雙向鏈表

    C++實(shí)現(xiàn)雙向鏈表

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)雙向鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05

最新評論

花莲县| 偃师市| 汉阴县| 阳高县| 丹江口市| 河北省| 黔东| 涞水县| 永仁县| 安乡县| 巍山| 龙泉市| 黄冈市| 花莲县| 昆山市| 浏阳市| 胶南市| 韩城市| 信阳市| 德保县| 张掖市| 黔东| 湟源县| 茌平县| 辽中县| 连城县| 和顺县| 璧山县| 邢台市| 东乡县| 扎兰屯市| 香格里拉县| 凤山县| 夏津县| 绥德县| 仲巴县| 图片| 常熟市| 皋兰县| 曲水县| 永寿县|