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;;  
  }
  //此处用函数重载,较为麻烦,可以使用接口函数进行访问;
}


相关文章
|
6月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
169 2
|
7月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
6月前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
259 3
|
9月前
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
162 20
|
9月前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
186 1
|
9月前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
283 7
|
11月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
182 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
11月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
95 3
|
11月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
185 2
|
2月前
|
存储 缓存 JavaScript
Set和Map有什么区别?
Set和Map有什么区别?
241 1