c++基础 STL 第五篇 (set / multiset容器 和 map / multimap容器)

文章目录

  • 一 set 和 multiset容器的基本概念
  • 二 set 容器的基本操作
    • 1 构造函数和赋值操作
    • 2 set 容器的大小和交换
    • 3 set 的插入和删除
  • 三 pair 对组创建
  • 四 map 和 multimap 容器的基本概念
    • 1 map 的构造和赋值操作
    • 2 map 容器的大小和交换
    • 3 map 容器的插入和删除

一 set 和 multiset容器的基本概念

概念
set 容器 为集合;multiset 也是集合;插入数据时候默认按升序排列。

说明

  1. set 和 multiset 的操作基本一致,区别在于,set容器不可以又重复的数据而multiset可以又重复的数据
  2. 即使你插入的数据是无序序列,set容器也会自动帮你排好顺序;
  3. set 容器插入时候没有push_back()的操作,只有insert()的操作;

二 set 容器的基本操作

掌握常用set的操作,类比于自己实现 multiset的操作;

1 构造函数和赋值操作

函数原型 功能
set st 默认构造函数
set(const set &st) 拷贝构造函数
set& operator=(const set &st) 重载等号操作符
#include 

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);
	//输出结果: 10 20 30 40 
	// 插入set容器会自动排序
	printSet(s1);

	//拷贝构造
	set<int>s2(s1);
	//输出结果: 10 20 30 40 
	printSet(s2);

	//赋值
	set<int>s3;
	s3 = s2;
	//输出结果: 10 20 30 40 
	printSet(s3);
}

2 set 容器的大小和交换

函数原型 功能
size() 容器中元素的数目
empty() 判断容器是否为空
swap(st) 交换两个集合容器

实例:

#include 

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;
	}

}

//交换
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);
}

3 set 的插入和删除

函数原型 功能
insert(elem) 在容器中插入elem元素。
clear() 清除所有元素
erase(pos) 删除pos迭代器所指的元素,
erase(beg, end) 删除区间[beg,end)的所有元素
erase(elem) 删除容器中值为elem的元素

注意

  1. set 容器没有在某个位置插入元素,也没有在某个区间插入元素,也没有在某个位置插入几个元素的方法;因为set容器本来就是排好序的,你如果有这些方法的话,会导致乱序;
  2. 插入自定义类型的数据需要提供仿函数作为 set 容器的参数;

实例:

#include 

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);
	//输出结果:10 20 30 40
	printSet(s1);

	//删除
	s1.erase(s1.begin());
	//输出结果: 20 30 40
	printSet(s1);

	s1.erase(30);
	//输出结果: 20  40
	printSet(s1);

	//清空
	//s1.erase(s1.begin(), s1.end());
	s1.clear();
	//输出结果: 
	printSet(s1);
}

自定义数据类型的插入
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)
	{
		//按照年龄进行排序  降序
		return p1.m_Age > p2.m_Age;
	}
};

void test02()
{	//创建容器时候,需要而外加入可对比的仿函数类型
	set<Person, comparePerson> s;

	Person p1("刘备", 23);
	Person p2("关羽", 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;
	}
}

三 pair 对组创建

对组pair 概念
当你需要返回两个数据时候可以用对组创建对象;

创建对组pair:
pair p ( value1, value2 );
pair p = make_pair( value1, value2 );

参数解释
type 为 数据类型;value1 和 value2 为数据;

访问数据的方式
p.first:访问第一个 value1值;
p.second: 访问第二 value2值;

实例:

void test01()
{
	pair<string, int> p("tom", 10);
	cout<<p.first<<endl;
	cout << p.second << endl;
		//传入匿名对象
	pair<string, int> p1(string("tom"), 10);
	cout << p1.first << endl;
	cout << p1.second << endl;

	pair<string, int> p2 = make_pair("jerry", 20);
	cout << p2.first << endl;
	cout << p2.second << endl;


}

四 map 和 multimap 容器的基本概念

概念
map 里面的元素都是 pair 对组;
pair 对组中第一个为key值,索引,第二个为value 值;
map 容器的 key 值 不可以重复,而multimap 的可以;
map容器里面的元素都是按 key 键值排好顺序的;

优点
map容器的优点就是,可以根据 key值快速找到 value值;

1 map 的构造和赋值操作

构造:

map mp; //map默认构造函数:
map(const map &mp); //拷贝构造函数
赋值:

map& operator=(const map &mp); //重载等号操作符

函数原型 功能
map mp; /map默认构造函数
map(const map &mp) 拷贝构造函数
map& operator=(const map &mp) 重载等号操作符

实例:

#include 

void printMap(map<int,int>&m)
{
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
	{	//由于是每个元素是pair对组 ,所以通过迭代器访问时候通过这种方式访问
		cout << "key = " << it->first << " value = " << it->second << endl;
	}
	cout << endl;
}

void test01()
{
	map<int,int>m; //默认构造,由于里面的每隔二元素都是pair对组
	//插入的元素pair(1, 10)为对组的匿名对象;
	m.insert(pair<int, int>(1, 10));
	m.insert(pair<int, int>(2, 20));
	m.insert(pair<int, int>(3, 30));
	printMap(m);

	map<int, int>m2(m); //拷贝构造
	printMap(m2);

	map<int, int>m3;
	m3 = m2; //赋值
	printMap(m3);
}

2 map 容器的大小和交换

函数原型 功能
size() 返回容器中元素的数目
empty() 判断容器是否为空
swap(st) 交换两个集合容器

操作和set容器一模一样;


3 map 容器的插入和删除

函数原型 功能
insert(elem) 在容器中插入元素。
clear() 清除所有元素
erase(pos) 删除pos迭代器所指的元素
erase(beg, end) 删除区间[beg,end)的所有元素
erase(key) 删除容器中值为key的元素。

插入的elem 是对组,所以插入的方式比较多;记住一两种种就可以
实例:

#include 

void printMap(map<int,int>&m)
{
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "key = " << it->first << " value = " << it->second << endl;
	}
	cout << endl;
}

void test01()
{
	//插入
	map<int, int> m;
	//第一种插入方式,匿名对象方式
	m.insert(pair<int, int>(1, 10));
	//第二种插入方式
	m.insert(make_pair(2, 20));
	//第三种插入方式
	m.insert(map<int, int>::value_type(3, 30));
	//第四种插入方式
	//插入键值为 4,值为40 的元素
	m[4] = 40; 
	printMap(m);

	//删除
	m.erase(m.begin());
	printMap(m);

	m.erase(3);
	printMap(m);

	//清空
	m.erase(m.begin(),m.end());
	m.clear();
	printMap(m);
}

注意
虽然 map 支持[ ]中括号的方式插入元素,但是不建议用中括号的方式插入元素;一般用中括号方式访问数据。[key]得到key对应的数据;通常可以结合 find(key) 查找key的位置,就可以用[ ]的方式访问数据.

你可能感兴趣的:(c++,c++)