第九层(8):STL之set/multiset(上)

简介: 第九层(8):STL之set/multiset(上)

前情回顾


在上一块石碑中,我学到了,同时下一块石碑也显露出来…


🚄上章地址:第九层(7):STL之list


set/multiset


概念


所有插入到set/multiset的数据,都会自动被排序,set/multiset的本质其实是二叉树


区别


set中不可以插入重复的元素

multiset可以插入重复的元素


构造函数


set/multiset的构造有两个,这里拿set的构造举例,multiset与set是一样的

set< T >;//默认构造
set(const set& s);//将s的数据拷贝到本身


使用:


#include<iostream>
#include<set>
using namespace std;
void print(set<int>& s)
{
  for (set<int>::iterator b = s.begin();b != s.end(); b++)
  {
  cout << *b << " ";
  }
  cout << endl;
}
void test1()
{
  set<int> s;
  s.insert(10);
  print(s);
  set<int> s1(s);
  print(s1);
}
int main()
{
  test1();
  return 0;
}

0a2653c851af460fa595bd959398a8f1.png


赋值函数


对于set/multiset而言,赋值操作只有一个,是操作符重载

set& operator=(const set &s);//将s的值拷贝到本身


使用:


#include<iostream>
#include<set>
using namespace std;
void print(set<int>& s)
{
  for (set<int>::iterator b = s.begin();b != s.end(); b++)
  {
  cout << *b << " ";
  }
  cout << endl;
}
void test1()
{
  set<int> s;
  s.insert(10);
  print(s);
  set<int> s1;
  s1 = s;
  print(s1);
}
int main()
{
  test1();
  return 0;
}

0eacb84100b54626af849e6b562bf92a.png


大小操作函数


在set/multiset中,对于大小是不能重新命名的,只能知道有多少个元素,或者是否为空

size()://返回容器中元素个数
empty();//判断容器是否为空


使用:


#include<iostream>
#include<set>
using namespace std;
void test1()
{
  set<int> s;
  if (s.empty())
  {
  cout << "为空" << endl;
  }
  cout << s.size() << endl;
}
int main()
{
  test1();
  return 0;
}

2d65d23f6d4748949b924e4057485923.png


交换函数


set中也可以让两个容器之间进行交换,也是swap

swap(s);//和s交换数据


使用:


#include<iostream>
#include<set>
using namespace std;
void print(set<int>& s)
{
  for (set<int>::iterator b = s.begin(); b != s.end(); b++)
  {
  cout << *b << " ";
  }
  cout << endl;
}
void test1()
{
  set<int> s;
  s.insert(1);
  set<int> s1;
  s1.insert(0);
  cout << "交换前" << endl;
  print(s);
  print(s1);
  s.swap(s1);
  cout << "交换后" << endl;
  print(s);
  print(s1);
}
int main()
{
  test1();
  return 0;
}

2e9b90b2ca334476abebe75bafe6eeaa.png


插入函数


在set中,只有一种插入方式

insert(T elem);//插入一个elem


使用:


void test1()
{
  set<int> s;
  s.insert(1);
  set<int> s1;
  s1.insert(0);
  cout << "交换前" << endl;
  print(s);
  print(s1);
  s.swap(s1);
  cout << "交换后" << endl;
  print(s);
  print(s1);
}
int main()
{
  test1();
  return 0;
}

0a2653c851af460fa595bd959398a8f1.png

同时验证了,插入进去的数会自己进行排序,排序为从小到大


删除函数


删除函数有四个基本的

clear();//删除容器中所有元素
erase(pos);//删除迭代器pos指向的元素,返回下一个元素的迭代器
erase(beg,end);//删除迭代器beg到end之间的元素,返回下一个元素的迭代器
erase(T elme);//删除容器中所有的elem,在set中是一个,但是multiset中可能有多个


使用:


#include<iostream>

#include<set>
using namespace std;
void print(set<int>& s)
{
  for (set<int>::iterator b = s.begin(); b != s.end(); b++)
  {
  cout << *b << " ";
  }
  cout << endl;
}
void test1()
{
  set<int> s;
  for (int i = 0; i < 10; i++)
  {
  s.insert(i);
  }
  print(s);
  set<int>::iterator b = s.begin();
  b++; b++; b++; b++; b++;
  s.erase(b);
  print(s);
  set<int>::iterator b1 = s.begin();
  b1++; b1++; b1++; b1++; b1++;
  s.erase(b1, s.end());
  print(s);
  s.erase(0);
  print(s);
  s.clear();
  print(s);
}
int main()
{
  test1();
  return 0;
}


0eacb84100b54626af849e6b562bf92a.png

0eacb84100b54626af849e6b562bf92a.png

相关文章
|
9月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
271 2
|
6月前
|
存储 编译器 容器
set、map、multiset、multimap的介绍及使用以及区别,注意事项
set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列。set当中存储元素的value都是唯一的,不可以重复,因此可以使用set进行去重。set默认是升序的,但是其内部默认不是按照大于比较,而是按照小于比较。set中的元素不能被修改,因为set在底层是用二叉搜索树来实现的,若是对二叉搜索树当中某个结点的值进行了修改,那么这棵树将不再是二叉搜索树。
256 0
|
9月前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
407 3
|
存储 编译器 C++
|
C++ 容器
C++之set/multiset容器
C++之set/multiset容器
112 1
|
存储 自然语言处理 C++
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
134 0
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
|
存储 C语言 容器
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(下)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
164 1
|
存储 C语言 容器
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(中)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
196 1
|
存储 自然语言处理 C语言
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(上)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
233 1
|
存储 算法 C++
【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧
【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧