C++学习 --set

目录

1, 什么是set

2, 创建set

2-1, 标准数据类型

2-2, 自定义数据类型

2-3, 其他创建方式

3, 操作set

3-1, 赋值

3-2, 添加元素(insert)

 3-2-1, 添加元素(insert)

3-2-2-1, 标准数据类型

3-2-2-2, 自定义数据类型

3-3, 查询

3-4, 查找(find)

3-4-1, 标准数据类型

3-4-2, 自定义数据类型

3-5, 获取长度(size)

3-6, 统计元素数量(count)

3-7, 交换(swap)

3-7, 删除元素(erase)

3-8, 清空元素(clear)

3-9, 判断是否为空(empty)

4, multiset


1, 什么是set

C++中的一种容器数据类型, 也叫集合容器, 会对插入的数据进行自动排序

分为set和multiset, 前者不允许重复值, 后置允许

2, 创建set

通过set<数据类型> 对象名, 创建set, 数据类型可以是标准数据类型, 也可以是自定义类型

2-1, 标准数据类型

//指定容器中元素数据类型为string
set s1;

2-2, 自定义数据类型

class Myclass
{
public:
	Myclass() {};
	Myclass(string name, int age) :m_name(name), m_age(age) {};
	string m_name;
	int m_age;
};

Myclass m("aaa", 1);
//容器中元素的类型为Myclass
set s1;

2-3, 其他创建方式

Myclass m1("aaa", 1);
set s1;
//拷贝构造方式创建
set s2(s1);
//通过迭代器指定区间方式创建
set s3(s2.begin(), s2.end());

3, 操作set

3-1, 赋值

通过set<数据类型> 对象名2 = 对象名1, 进行赋值

set s1;
set s2 = s1;

3-2, 添加元素(insert)

 3-2-1, 添加元素(insert)

通过对象名.insert(值), 可向set中插入元素

3-2-2-1, 标准数据类型
set s1;
//向set容器中插入字符串对象aaa
s1.insert("aaa");
3-2-2-2, 自定义数据类型
//仿函数,定义排序规则
class MyCompare
{
public:
	bool operator()(const Myclass m1, Myclass m2) const
	{
		return m1.m_name > m2.m_name;
	}
};

Myclass m1("aaa", 1);
//插入自定义类型时,需要指定仿函数
set s1;
//向set容器中插入m1
s1.insert(m1);
//通过迭代器指定位置插入
s1.insert(s1.begin(), m2);

3-3, 查询

通过for循环, 可遍历set中的元素

class Myclass
{
public:
	Myclass() {};
	Myclass(string name, int age) :m_name(name), m_age(age) {};
	string m_name;
	int m_age;
};

class MyCompare
{
public:
	bool operator()(const Myclass m1, Myclass m2) const
	{
		return m1.m_name > m2.m_name;
	}
};

int main()
{
	Myclass m1("aaa", 1);
	Myclass m2("bbb", 1);
	set s1;
	s1.insert(m1);
	s1.insert(m2);
	for (set::iterator it = s1.begin(); it != s1.end(); it++)
	{
		cout << "姓名:" << it->m_name << " 年龄:" << it->m_age << endl;
	}
	system("pause");

	return 0;
}

3-4, 查找(find)

通过对象名.find(元素), 获取s1中的元素, 找到返回对应的迭代器,未找到返回s1.end()

3-4-1, 标准数据类型

set s1;
s1.insert("aaa");
//通过s1.find(m1)查找s1中的m1元素, 找到返回对应的迭代器,未找到返回s1.end()
set::iterator ret = s1.find("aaa1");

if (ret != s1.end())
{
	cout << "存在" << endl;
}
else
{
	cout << "不存在" << endl;
}

3-4-2, 自定义数据类型

//通过s1.find(m1)查找s1中的m1元素, 找到返回对应的迭代器,未找到返回s1.end()
set::iterator ret = s1.find(m1);

if (ret != s1.end())
{
	cout << "存在m1" << endl;
}
else
{
	cout << "不存在m1" << endl;
}

3-5, 获取长度(size)

通过对象名.size(), 获取set的元素个数

cout << s1.size() << endl;

3-6, 统计元素数量(count)

通过对象名.count(对象), 获取set的元素个数

cout << s1.count(m1) << endl;

3-7, 交换(swap)

通过对象名1.swap(对象名2) 交换两个set的元素, 两个set的数据类型需要一致

s1.swap(s2);

3-7, 删除元素(erase)

通过对象名.erase(迭代器位置), 删除元素

//指定迭代器位置删除元素
set::iterator it = s1.begin();
it++;
it++;
s1.erase(it);

3-8, 清空元素(clear)

通过对象名.clear(), 清空set元素

s1.clear();
//指定迭代器区间清空元素
s1.erase(s1.begin(), s1.end());

3-9, 判断是否为空(empty)

通过对象名.empty(), 判读set容器中元素是否为空, 为空返回1, 不为空返回0

cout << s1.empty() << endl;

4, multiset

multiset可插入重复的元素

int main()
{
	multiset s1;
	s1.insert("m1");
	s1.insert("m1");
	s1.insert("m1");
	
	for (multiset::iterator it = s1.begin(); it != s1.end(); it++)
	{
		cout << *it << endl;
	}
	system("pause");

	return 0;
}

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