STL容器之initializer_list与set

Posted 温柔了岁月.c

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL容器之initializer_list与set相关的知识,希望对你有一定的参考价值。

STL容器之initializer_list与set

initializer_list

initializer_list创建的对象,初始值可以有很多个,像vector 一样
想多少个,就多少个。

include<iostream>
#include<initializer_list>

using namespace std;

int main()
 
	initializer_list<int> date =  1, 2, 3, 9 ; //列表  想写多少就写多少
	
	system("pause");
	return 0;


## 案例一:vector动态数组的简单模拟

可以用作函数的参数(可以传一个,二个,想传多少个就多少个)
同时,注意,这里是常链表,用cons修饰
这里使用了委托构造

#include<iostream>
#include<initializer_list>

using namespace std;

template <class T>
class m_vector

public:
	m_vector(int cursize) : cursize(0)
	
		men = new T[cursize];
	

	m_vector( const initializer_list<T>& object): m_vector(object.size())//委托构造,初始化
	
		for (auto& v : object)
		
			men[cursize++] = v;
		
	

	void printDate()
	
		for (int i = 0; i < cursize; i++)
		
			cout << men[i];
		
	

private:
	T* men;
	int cursize;
;

int main()

	m_vector <int> mm =  1, 6, 8 ; //常数列表用const修饰

	mm.printDate();

	system("pause");
	return 0;

案例二(实现n个数的加法)

#include<iostream>
#include<initializer_list>

using namespace std;

int add(initializer_list<int> date)

	int cout = 0;

	for (auto& v : date)
	
		cout += v;
	

	return cout;



int main()

	//利用initializer_list 可以求任意数之和
	cout << add( 1, 3, 4 ) << endl;;

	cout << add( 2, 4, 8, 9, 0, 9, 8, 6 );

	system("pause");
	return 0;

set

set也叫做集合的意思,有以下2个特性
1.有序性:默认的排序是从小到大进行排列
2.唯一性:相同值只保留一个、

单集合

有序性

#include<iostream>
#include<set>

using namespace std;

int main()

	set<int> date =  1, 3, 0 ,8, 6, 4 ;  //set容器自动排序 从小到大

	for (auto& v : date)
	
		cout << v;
	

	system("pasue");
	return 0;

唯一性

#include<iostream>
#include<set>

using namespace std;

int main()


	set<int> date =  9, 9, 7, 8, 0, 6 ;

	date.insert(2); //insert()插入函数,插入一个2;

	for (auto& v : date)
	
		cout << v;
	

	system("pause");
	return 0;

删除元素

#include<iostream>
#include<set>

using namespace std;

int main()

	set<int> date =  1, 8, 9, 6 ;

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

	date.erase(find(date.begin(), date.end(), 9)); //删除元素,erase(),通常结合find算法加迭代器

	for (auto& v : date)
	
		cout << v;
	

	system("pause");
	return 0;


多重集合

多重集合,只具有排序功能,不具有去重功能

#include<iostream>
#include<set>

using namespace std;

int main()

	multiset<int> date =  1, 3, 4, 5, 6,5 ;

	for (auto& v : date)
	
		cout << v;
	

less与greater

#include
#include

using namespace std;

int main()

set<int,less> date = 1, 2, 4, 3, 9, 5, 6, 6 ; //less从小到大排列

for (auto& v : date)

	cout << v;

cout << endl;
 
set<int, greater<int>> date1 =  0, 3, 4, 1, 2, 2 , 3 ,4 ,1 ; //greater 从大到小排列

for (auto& v : date1)

	cout << v;

自定义类型

set处理自定义类型
比较的方法,不推荐使用重载,使用仿函数
同样后面打印的话,使用新式for循环加接口函数较为方便,使用函数重载的话,重载就较为复杂

#include<iostream>
#include<set>
#include<string>

using namespace std;

class MM

public:
	MM(int age,string name): age(age), name(name) 

	int getAge() const  return age;
	string getName() const  return name; 

private:
	int age;
	string name;
;

class compareName

public:
	bool operator ()(const MM& object1, const MM& object2) const
	
		return object1.getName() < object2.getName();
	
;

int main()

	set<MM, compareName> date;
	date.insert(MM(10, "张三"));
	date.insert(MM(13, "李"));
	date.insert(MM(89, "nininninin"));
	
	for (auto& v : date)
	
		cout << v.getAge() << " " << v.getName() << endl;;  
	
	//此处用函数重载,较为麻烦,可以使用接口函数进行访问;

stl之set的用法

1 set介绍
(1)set是STL中一个很有用的容器,用来存储同一种数据类型的数据结构(可以称之为K的模型,红黑树的啥东西),基本功能与数组相似。
(2)set与数组不同的是,在set中每个元素的值都是唯一的。
(3)而且set插入数据时,能够根据元素的值自动进行排序。
(4)set中数元素的值并不能直接被改变。
2,简单函数使用。

begin()        ,返回set容器的第一个迭代器

end()      ,返回set容器的最后一个迭代器

clear()          ,删除set容器中的所有的元素

empty()    ,判断set容器是否为空

max_size()   ,返回set容器可能包含的元素最大个数

size()      ,返回当前set容器中的元素个数

rbegin     ,返回的值和end()相同

rend()     ,返回的值和rbegin()相同

count()              ,返回集合中某个值的元素个数。比如count(3),返回集合中值为3的集合的个数。
3,实际操作使用案例

0. 定义一个set容器

  • step1:using namespace std;
  • step2:直接set<成员类型>成员名

例如:定义一个整型的set容器叫做cc,那么直接set<int> cc就行了

1. insert操作

作用:往你定义的set里面加上一个数。

  • step1:定义一个辅助变量tmp;
  • step2:输入tmp;
  • step3:将tmp放进你定义的set容器里面。

例如:往刚定义的cc里面放一个tmp,那么直接:cc.insert(tmp)即可。


 

2. clear操作

作用:清空你的set容器。

  • step1:将你的set容器清空。

例如:将刚才定义的cc清空,则为:cc.clear()即可。


 

3. empty判断

作用:判断你的容器是否为空。

  • step1:判断你的容器是否为空。

例如:判断cc是否为空,只需 if(cc.empty())  即可,判断是否非空,只需if (!cc.empty())。

额这块解释一下应该,empty()为空的话应该返回的是1,不为空的话返回0.

我觉得你可以测试下。


 

4. size询问

作用:询问你的容器里有多少个元素。

例如:询问cc的大小,只需 printf("%d ",cc.size())即可。

特别的,size返回的是非重复元素,而不是所有元素。

例如:

cc里面有{1 2 3 4 5 6 7 8} 8个元素,那么他的返回值是8;

cc里面有{1 1 1 1 1 1 1 1} 8个元素,那么他的返回值是1;

cc里面有{1 1 1 2 2 6 2 1} 8个元素,那么他的返回值是3。

额,这里面不是不允许有重复值嘛。。。


 

5. begin,end和对set容器的遍历

这个东西的确有点难……

首先,如果你要对一个set容器进行遍历的话,你要多开两个迭代器,然后以这两个迭代器分别为头和尾遍历。

如果你要对cc进行一次遍历输出,下面是具体操作步骤:

step1:定义两个东西:①set<int>::iterator starti = cc.begin();②set<int>::iterator endi = cc.end();

step2:进行一次遍历:

for (;starti!=endi;starti++)
{
    printf("%d
",*starti);
}

因为begin()和end()返回的都是第一个或者最后一个元素的地址,所以我们在输出的时候就要加个指针*,表示指向该地址存放的元素。

当然,begin()和end()还有其它的用处,具体的就在刷题过程中领悟吧。

重点提示:循环的时候,不能写成starti<=endi,因为这里面没有重载<=的符号,只有!=。


 6. max_size询问

询问的是这个set容器的最大存放量。

这东西好像没什么用QAQ……

首先定义一个叫cc的set容器,然后直接询问cc.max_size()就行啦。

以上是关于STL容器之initializer_list与set的主要内容,如果未能解决你的问题,请参考以下文章

stl之set的用法

C++ STL之set详解

C++ STL之set详解

C++的探索路20标准模板库STL之STL的基本概念与容器

C++的探索路20标准模板库STL之STL的基本概念与容器

stl源码剖析-序列式容器 之 list