set 是关联容器,含有 Key 类型对象的已排序集。用比较函数 比较 (Compare) 进行排序。搜索、移除和插入拥有对数复杂度。 set 通常以红黑树实现。本篇学习set的创建及初始化。

示例代码:

#include <iostream>
#include <set>
#include <string>
#include <functional>
#include <cmath>using namespace std;bool fncomp_greater (int lhs, int rhs) {return lhs > rhs;}bool fncomp_less (int lhs, int rhs) {return lhs < rhs;}struct classcomp_less {bool operator() (const int& lhs, const int& rhs) const{return lhs < rhs;}
};struct classcomp_greater {bool operator() (const int& lhs, const int& rhs) const{return lhs > rhs;}
};struct Point { int x, y; };
struct PointCmp_greater {bool operator()(const Point& lhs, const Point& rhs) const {return std::hypot(lhs.x, lhs.y) > std::hypot(rhs.x, rhs.y);//hypot计算三解形的斜边长}
};
struct PointCmp_less {bool operator()(const Point& lhs, const Point& rhs) const {return std::hypot(lhs.x, lhs.y) < std::hypot(rhs.x, rhs.y);}
};void createSetInit()
{string str =  "《凉州词(王翰)》 葡萄美酒夜光杯,欲饮琵琶马上催。醉卧沙场君莫笑,古来征战几人回? ";//1.创建setstring strVal[] = {"first", "second", "three", "fifth"};set<string> set1(strVal, strVal + 4);cout << "set1.size = " << set1.size() << " set1.empty = " << set1.empty() << " set1.max_size = " << set1.max_size() << endl;cout << "set1.size = " << set1.size() << " set1.empty = " << set1.empty() << " set1.max_size = " << set1.max_size() << endl;cout << "set1的值为:  ";set<string>::iterator iter1;for(iter1 = set1.begin(); iter1 != set1.end(); iter1++){cout << *iter1 << "\t";}cout << endl;//2.列表初始化set<int> set2 = {1, 2, 3, 4};cout << "set2.size = " << set2.size() << " set2.empty = " << set2.empty() << " set2.max_size = " << set2.max_size() << endl;cout << "set2的值为:  ";for(auto &val: set2){cout << val << "\t";}cout << endl;//3.赋值初始化set<int> set3 = set2;cout << "set3的值为:  ";for(auto &val: set3){cout << val << "\t";}cout << endl;//4.拷贝初始化set<string> set4(set1);cout << "set4.size = " << set4.size() << " set4.empty = " << set4.empty() << " set4.max_size = " << set4.max_size() << endl;cout << "set4的值为:  ";for(auto &val: set4){cout << val << "\t";}cout << endl;//5.范围初始化set<int> set5(set2.begin(), set2.end());cout << "set5.size = " << set5.size() << " set5.empty = " << set5.empty() << " set5.max_size = " << set5.max_size() << endl;cout << "set5的值为:  ";for(auto &val: set5){cout << val << "\t";}cout << endl;//6.移动构造函数set<string> set6(std::move(set1));cout << "set6.size = " << set6.size() << " set6.empty = " << set6.empty() << " set6.max_size = " << set6.max_size() << endl;auto iter6 = set6.begin();cout << "set6的值为:  ";while (iter6 != set6.end()){cout << *iter6 << "\t";iter6++;}cout << endl;cout << "-----------------------" << endl;// class as Comparestd::set<int> set7 = {1, 7, 3, 4, 3};//最后一个数会失效auto iter7 = set7.begin();//默认是升序输出的cout << "默认是升序输出的  set7的值为:  ";while (iter7 != set7.end()){cout << *iter7 << "\t";iter7++;}cout << endl;std::set<int, classcomp_less> set8 = {1, 7, 3, 4, 3};//最后一个数会失效auto iter8 = set8.begin();cout << "升序输出        set8的值为:  ";//升序输出while (iter8 != set8.end()){cout << *iter8 << "\t";iter8++;}cout << endl;std::set<int, classcomp_greater> set9 = {1, 7, 3, 4, 3};//最后一个数会失效auto iter9 = set9.begin();cout << "降序输出        set9的值为:  ";//降序输出while (iter9 != set9.end()){cout << *iter9 << "\t";iter9++;}cout << endl;//也可以调用系统自带的比较函数,例如greater,less, 要包含头文件functionalstd::set<int, greater<int>> set10 = {1, 7, 3, 4, 3};//最后一个数会失效auto iter10 = set10.begin();cout << "降序输出 set10的值为:  ";//降序输出while (iter10 != set10.end()){cout << *iter10 << "\t";iter10++;}cout << endl;std::set<int, less<int>> set11 = {1, 7, 3, 4, 3};//最后一个数会失效auto iter11 = set11.begin();cout << "升序输出 set11的值为:  ";//降序输出while (iter11 != set11.end()){cout << *iter11 << "\t";iter11++;}cout << endl;bool(*fn_pt)(int,int) = fncomp_less;std::set<int, bool(*)(int,int)> set12 (fn_pt);  // function pointer as Compareset12.insert(1);set12.insert(7);set12.insert(4);set12.insert(3);auto iter12 = set12.begin();cout << "升序输出 set12的值为:  ";//降序输出while (iter12 != set12.end()){cout << *iter12 << "\t";iter12++;}cout << endl;bool(*fn_pt_greater)(int,int) = fncomp_greater;std::set<int, bool(*)(int,int)> set13 (fn_pt_greater);set13.insert(1);set13.insert(7);set13.insert(4);set13.insert(3);auto iter13 = set13.begin();cout << "升序输出 set13的值为:  ";//升序输出while (iter13 != set13.end()){cout << *iter13 << "\t";iter13++;}cout << endl;//自定义类型比较std::set<Point, PointCmp_greater> set14 = {{1, 2}, {7, 8}, {3, 4}, {3, 5}};set14.insert({8, 7}); // 这会失败,因为 8,7 的斜边长度等于 7,8cout << "降序输出 set14的值为:    ";for(auto& p: set14)cout << '(' << p.x << ',' << p.y << ") ";cout << endl;std::set<Point, PointCmp_less> set15 = {{1, 2}, {7, 8}, {3, 4}, {3, 5}};set15.insert({8, 7});cout << "升序输出 set15的值为:    ";for(auto& p: set15)cout << '(' << p.x << ',' << p.y << ") ";cout << endl;
}int main()
{createSetInit();cout << "Hello, world!" << endl;return 0;
}

运行结果

参考:

http://www.cplusplus.com/reference/set/set/

https://zh.cppreference.com/w/cpp/container/set

set学习之创建,初始化,赋值操作operator=, empty,size相关推荐

  1. multimap学习之创建,初始化,赋值操作operator=, empty,size,max_size

    multimap 是关联容器,含有键值对的已排序列表,其功能与map一样,唯一不同的是,它容许多个元素拥有同一键.本篇学习map的创建,初始化,赋值操作operator=, empty,size,ma ...

  2. multiset学习之创建,初始化,赋值操作operator=, empty,size

    本篇开始学习multiset,与set相比,multiset可以有多个相关的关键字,其它也set的功能一样,下面我们先来学习它的创建,初始化,赋值操作operator=, empty,size等相关操 ...

  3. C语言--关于指针两种初始化赋值操作

    首先,什么叫做指针的初始化?  int * p = NULL:在定义指针变量p的同时把p的值设置为0x00000000;而不是把*p的值设置为0x00000000.这个过程叫做初始化. 探讨: int ...

  4. forword_list学习之创建,初始化assign,赋值操作operator=, 元素访问front,交换内容swap,检查容器是否为空empty

    forword_list是C++11新增的一个顺序容器,它是支持从容器的任何位置快速插入和移动元素的容器.不支持快速随机访问.它实现为单链表,且实质上与其在C中实现相比无任何开销.与std::list ...

  5. pandas学习笔记三之赋值操作

  6. matlab学习笔记11_3高维数组操作 filp, shiftdim, size, permute, ipermute

    一起来学matlab-matlab学习笔记11 11_3 高维数组处理和运算 filp, shiftdim, size, permute, ipermute 觉得有用的话,欢迎一起讨论相互学习~ fi ...

  7. 【C++】类的成员初始化表与构造函数内赋值操作

    我们常常在初始化类数据成员的时候,对使用初始化表和在构造函数中十分困惑,这二者有什么区别呢?我们应该如何选择呢? 先举个简单的例子,看下面的两段代码: 代码A: inline Account::Acc ...

  8. 关于学习Python的一点学习总结(26->自定义函数及创建初始化数据结构函数)

    62.自定义函数: 1.判断某个对象是否可调用,使用内置函数callable >>> import math>>> x=1>>> y=math.s ...

  9. 【STL】string详解(string类常用的操作函数、构造函数、赋值操作、子符串的拼接、查找和替换、比较、存取、插入和删除、获取)

    目录 1. string容器 简介 2. string类常用的操作函数 3. 构造函数 4. 赋值操作 5. 字符串拼接 6. 字符串查找和替换 7. 字符串比较 8. 字符串存取 9. 字符串插入和 ...

最新文章

  1. Python使用PIL将png图片转化为jpg图片
  2. 知识图谱的皇冠:知识图谱推理的前世今生
  3. jquery实现登录失败提示_浅谈jQuery的verify验证码
  4. 栈应用:中缀表达式转后缀表达式
  5. 电脑画画软件_绘画软件分享,还不过来看!
  6. 《中国人工智能学会通讯》——4.40 什么是类人概念学习?
  7. 按键精灵设置脚本过期日期
  8. css视差滑动(阅读网站案例)
  9. 记录一次实战破解无线wifi——Aircrack-ng
  10. 互联网下半场的基本玩法
  11. “身体质量指数BMI”实例详解
  12. 兔年新春,快来领取你的春节全屏动效吧
  13. java jmf获取图像_java利用jmf实现拍照功能
  14. 不连接显示器或者HDMI欺骗器来 使用Moonlight串流游戏
  15. c调用python第三方库_c/c++调用python程序且含tensorflow第三方库
  16. HTML5 CSS3 专题 诱人的实例 3D旋转木马效果相册
  17. 15个iOS的视频播放控件
  18. lib/python3.7/site-packages/torch/lib/../../../../libgomp.so.1: version `GOMP_4.0‘ not found (requir
  19. 调侃计算机专业的句子,调侃生活的幽默句子
  20. 婚姻出问题女人应该捂紧钱袋

热门文章

  1. OWT-SERVER
  2. JPA 中 one-toone 一对一 映射
  3. 计算机考级各省份难度,各地区公务员考试难度排行榜,想上岸,去这些省份考!...
  4. 渝粤教育 陕西师范大学 《中国古典文献学》作业
  5. C++项目实战-高并发服务器详析
  6. 学一点Wi-Fi:SAE
  7. Abaqus进阶-汽车吸能盒冲击动力学分析 step by step
  8. 细看AI芯片的“小趋势”
  9. Android Jetpack 实战
  10. 分享35款最新出炉的免费个人博客模板