C++STL---Set和multiset容器

set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。
set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。
multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次。
不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素。
C++STL---Set和multiset容器_第1张图片
set/multiset对象的默认构造
set setInt; //一个存放int的set容器。
set setFloat; //一个存放float的set容器。
set setString; //一个存放string的set容器。
multiset mulsetInt; //一个存放int的multi set容器。
multi set multisetFloat; //一个存放float的multi set容器。
multi set multisetString; //一个存放string的multi set容器。
set的插入与迭代器
set.insert(elem); //在容器中插入元素。
set.begin(); //返回容器中第一个数据的迭代器。
set.end(); //返回容器中最后一个数据之后的迭代器。
set.rbegin(); //返回容器中倒数第一个元素的迭代器。
set.rend(); //返回容器中倒数最后一个元素的后面的迭代器。
代码如下:
本代码验证了,集合中的元素唯一,默认按照从小到大的顺序排列。

  void main9()
    {
    	set set1;
    	for (int i = 0; i < 5; i++)
    	{
    		int tmp = rand();
    		set1.insert(tmp);
    	}
    	set1.insert(100);
    	set1.insert(100);
    	set1.insert(100);
    	set1.insert(100);
    	for (set::iterator it = set1.begin(); it != set1.end(); it++)
    	{
    		cout << *it << "  ";
    	}
    }

C++STL---Set和multiset容器_第2张图片

集合的删除

void main9()
{
	set set1;

	for (int i = 0; i < 5; i++)
	{
		int tmp = rand();
		set1.insert(tmp);
	}
	set1.insert(100);
	set1.insert(100);
	set1.insert(100);
	set1.insert(100);

	for (set::iterator it = set1.begin(); it != set1.end(); it++)
	{
		cout << *it << "  ";
	}
	//删除集合。
	cout << endl;
	cout << "删除集合:" << endl;
	cout << "删除前set1的大小是" << set1.size() << endl;
	while (!set1.empty())
	{
		set::iterator it = set1.begin();
		cout << *it << endl;
		set1.erase(set1.begin());
	}
	cout <<"删除后set1的大小是"<< set1.size() << endl;
}

C++STL---Set和multiset容器_第3张图片

默认情况下从大到小排序

void main92()
{
	set set1;
	set> set2;
	set< int, greater> set3;  // 从大到小。

	for (int i = 0; i < 5; i++)
	{
		int tmp = rand();
		set3.insert(tmp);
	}
	// 从大到小。
	for (set>::iterator it = set3.begin(); it != set3.end(); it++)
	{
		cout << *it << endl;
	}
}

C++STL---Set和multiset容器_第4张图片

set集合元素排序, 对类进行排序

class Student
{
public:
	Student(char *name, int age)
	{
		strcpy_s(this->name, name);
		this->age = age;
	}
public:
	char name[64];
	int age;
};

struct FuncStudent
{
	bool operator()(const Student &left, const Student &right)
	{
		if (left.age < right.age)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
};
void main93()
{
	set set1;
	char name1[64] = "s1";
	char name2[64] = "s2";
	char name3[64] = "s3";
	char name4[64] = "s4";
	Student s1(name1, 31);
	Student s2(name2, 44);
	Student s3(name3, 65);
	Student s4(name4, 23);
	set1.insert(s1);
	set1.insert(s2);
	set1.insert(s3);
	set1.insert(s4); 
	//遍历
	for (set::iterator it = set1.begin(); it != set1.end(); it++)
	{
		cout << it->age << "\t" << it->name << endl;
	}
}
int main()
{
	// main92();
	main93();
	system("pause");
	return 1;
}

C++STL---Set和multiset容器_第5张图片

pair的使用

pair返回的是,set.insert1的插入结果。

class Student
{
public:
	Student(char *name, int age)
	{
		strcpy_s(this->name, name);
		this->age = age;
	}
public:
	char name[64];
	int age;
};

struct FuncStudent
{
	bool operator()(const Student &left, const Student &right)
	{
		if (left.age < right.age)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
};
void main93()
{
	set set1;
	char name1[64] = "s1";
	char name2[64] = "s2";
	char name3[64] = "s3";
	char name4[64] = "s4";
	char name5[64] = "s5";
	Student s1(name1, 31);
	Student s2(name2, 44);
	Student s3(name3, 65);
	Student s4(name4, 23);
	Student s5(name5, 31);

	pair::iterator, bool> pair1 = set1.insert(s1);
	if (pair1.second == true)
	{
		cout << "插入s1成功" << endl;
	}
	else
	{
		cout << "插入s1失败" << endl;
	}

	set1.insert(s2);

	//如何知道 插入 的结果
	pair::iterator, bool> pair5 = set1.insert(s5); //如果两个31岁 能插入成功  
	if (pair5.second == true)
	{
		cout << "插入s5成功" << endl;
	}
	else
	{
		cout << "插入s5失败" << endl;
	}

	//遍历
	for (set::iterator it = set1.begin(); it != set1.end(); it++)
	{
		cout << it->age << "\t" << it->name << endl;
	}
}
int main()
{
	// main92();
	main93();
	system("pause");
	return 1;
}

C++STL---Set和multiset容器_第6张图片

multiset容器

和set的不同的地方在于,能把不同的元素添加到里面。

void main94()
{
	multiset set1;
	int tmp = 0;
	printf("请输入multiset集合的值:");
	scanf("%d", &tmp);
	while (tmp != 0)
	{
		set1.insert(tmp);
		printf("请输入multiset集合的值:");
		scanf("%d", &tmp);
	}
	//遍历
	for (multiset::iterator it = set1.begin(); it != set1.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
	while (!set1.empty())
	{
		multiset::iterator it = set1.begin();
		cout << *it << " ";
		set1.erase(it);
	}
}

C++STL---Set和multiset容器_第7张图片

你可能感兴趣的:(C++)