STL容器之initializer_list与set
- initializer_list
- 案例二(实现n个数的加法)
- set
- 单集合
- 有序性
- 唯一性
- 删除元素
- 多重集合
- less与greater
- 自定义类型
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;;
}
//此处用函数重载,较为麻烦,可以使用接口函数进行访问;
}