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的主要内容,如果未能解决你的问题,请参考以下文章