【嵌入式——C++】set(STL)

【嵌入式——C++】 set(STL)

  • 基本概念
  • 构造和赋值
  • 大小和交换
  • 插入和删除
  • 查找和统计
  • set和multiset区别
  • pair对组
  • 排序

基本概念

插入时自动排序,不允许有重复元素,set和multiset属于关联式容器,底层数据结构是二叉树,multiset可以有重复元素。
需要引入头文件#include

构造和赋值

默认构造

set<int> s1;

拷贝构造

set<int> s2(s1)

赋值

operator=

代码示例


void printSet(set<int> &s) {
 for (set<int>::iterator it = s.begin(); it != s.end();it++) {
  cout << *it << " ";
 }
 cout << endl;
}


void testSet01() {
 //默认构造
 set<int> s1;
 //所有元素插入时候自动排序
 s1.insert(10);
 s1.insert(20);
 s1.insert(30);
 s1.insert(40);
 s1.insert(50);
 s1.insert(60);
 printSet(s1);//10 20 30 40 50 60
 //拷贝构造
 set<int> s2(s1);
 printSet(s2);//10 20 30 40 50 60
 
 set<int> s3;
 //赋值
 s3 = s2;
 printSet(s3);//10 20 30 40 50 60

}

大小和交换

  1. swap(lst):交换两个集合容器;
  2. size():返回元素个数;
  3. empty():判空;

代码示例

void testSet02() {
 set<int> s1;
 s1.insert(10);
 s1.insert(20);
 s1.insert(30);
 printSet(s1);//10 20 30

 if (!s1.empty()) {
  cout << "set元素个数" << s1.size() << endl;
 }
 else {
  
 }
 set<int> s2;
 s2.insert(100);
 s2.insert(101);
 s2.insert(102);
 printSet(s2);//100 101 102
 s1.swap(s2);
 printSet(s1);//100 101 102
 printSet(s2);//10 20 30
 
}

插入和删除

  1. insert():插入;
  2. clear():清空;
  3. erase():删除;

代码示例

void testSet03() {

 set<int> s1;
 s1.insert(10);
 s1.insert(20);
 s1.insert(30);
 s1.insert(40);
 printSet(s1);//10 20 30 40
 //删除
 s1.erase(s1.begin());
 printSet(s1);//20 30 40

 s1.erase(30);
 printSet(s1);//20 40
 //清空
 s1.erase(s1.begin(),s1.end());
 //清空
 s1.clear();

}

查找和统计

  1. find(key):根据key来进行查找,若存在,返回该键的元素的迭代器,若不存在返回set.end();
  2. count(key):统计key的元素个数;

代码示例

void testSet04() {

 set<int> s1;
 s1.insert(10);
 s1.insert(20);
 s1.insert(30);
 s1.insert(40);
 printSet(s1);//10 20 30 40
 
 set<int>::iterator pos = s1.find(10);
 if(pos != s1.end()){
  cout << "找到元素" << *pos << endl;//找到元素10
 }
 else {
  cout << "未找到元素" << endl;
 }
 
 cout<<"统计元素个数"<< s1.count(40) << endl;//统计元素个数1

set和multiset区别

  1. set不可以插入重复数据,multiset可以;
  2. set插入数据的同时会返回插入结果,表示插入是否成功;
  3. multiset不会检测数据,因此可以插入重复数据;

代码示例


void testSet05() {

 set<int> s1;
 // pair 
 pair<set<int>::iterator, bool>  ret = s1.insert(10);
 if (ret.second) {
  cout << "插入成功" << endl;
 }
 else {
  cout << "插入失败" << endl;
 }
 pair<set<int>::iterator, bool>  ret1 = s1.insert(10);
 if (ret1.second) {
  cout << "插入成功" << endl;
 }
 else {
  cout << "插入失败" << endl;
 }
 printSet(s1);//10 20 30 40


 multiset<int> s2;

 //iterator
 s2.insert(30);
 s2.insert(30);
 //30 30
 for (multiset<int>::iterator it = s2.begin(); it != s2.end();it++) {
  cout << *it <<" ";
 }
 cout<<endl;
}

pair对组

成对出现的数据,利用对组可以返回两个数据。

void testSet06() {

 pair<string, int> p("jack", 10);
 cout << "姓名:" << p.first << " 年龄:" << p.second<<endl; //姓名:jack 年龄:10

 pair<string, int> p2 = make_pair("jack", 10);
 cout << "姓名:" << p2.first << " 年龄:" << p2.second << endl; //姓名:jack 年龄:10

}

排序

set容器默认排序规则是从小到大,利用仿函数可以改变排序规则。

set存放内置数据类型

class MyCompare {
public :
 //重载小括号
 bool operator()(int v1,int v2) const
 {
  return v1 > v2;
 }

};

void testSet07() {
 set<int> s1;
 s1.insert(10);
 s1.insert(60);
 s1.insert(30);
 s1.insert(40);
 s1.insert(20);

 printSet(s1);//10 20 30 40 60 默认排序

 //指定排序规则 从大到小
 set<int, MyCompare> s2;
 s2.insert(10);
 s2.insert(60);
 s2.insert(30);
 s2.insert(40);
 s2.insert(20);
 for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++) {
  cout << *it << " ";// 60 40 30 20 10
 }
 cout << endl;

}
bool operator()(int v1,int v2) const 如果不加const会报
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C3848 具有类型“const MyCompare”的表达式会丢失一些 const-volatile 限定符以调用“bool MyCompare::operator ()(int,int)” Containers D:\Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\xutility 1455 

set存放自定义数据类型

class Person {
public:
 Person(string name, int age) {
  this->name = name;
  this->age = age;
 }
 string name;
 int age;
};

class comparePerson {

public:
 bool operator()(const Person& p1, const Person& p2) const{
  //按照年龄降序
  return p1.age > p2.age;
 }

};

void testSet08() {
 //自定义数据类型 需要指定排序规则 否则会报以下问题
 set<Person, comparePerson> s;

 Person p1("刘备",55);
 Person p2("关羽", 33);
 Person p3("张飞", 32);

 s.insert(p1);
 s.insert(p2);
 s.insert(p3);

 for (set<Person, comparePerson>::iterator it = s.begin(); it != s.end(); it++) {
  cout << "姓名:" << it->name << " 年龄:" << it->age<<endl;
  //姓名:刘备 年龄:55
  //姓名:关羽 年龄:33
  //姓名:张飞 年龄:32
 }
//严重性 代码 说明 项目 文件 行 禁止显示状态
//错误 C2676 二进制“ < ”:“const _Ty”不定义该运算符或到预定义运算符可接收的类型的转换 Containers D : \Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\xstddef 117

你可能感兴趣的:(c++,开发语言,qt,物联网,set)