C++ STL之Set

set是关联容器,类似于集合。

特点是里面的元素不会重复,而且元素时有序的。

1.声明定义:

#include<set>using namespace std;set<int> s;

2.常见用法

s.inert(5); //插入
s.begin();  //返回s的第一个元素 

s.end(); // 返回最后一个元素

s.clear() ; //清空

s.empty(); //判断是否为空

s.max_size() //返回最可能包含的元素最大个数

s.size();        //返回当前元素的个数

s.rbegin();     //同end()

s.rend();       // 同begin()

s.equal_range();  //返回集合中与给定值相等的上下限两个迭代器

s.erase();          //删除集合中的元素

s.lower_bound  //返回大于或等于某值的第一个元素迭代器

s.key_comp();   //返回一个用于中间值比较的函数

s.upper_bound  //返回大于的第一个元素迭代器

3.自定义比较函数

1)元素不是结构体:(自定义比较函数myComp,重载“()”操作符)

struct myComp{bool operator() (const your_type &a,const your_type &b){return a.data - b.data > 0;}
}

2)如果元素是结构体

struct Info{string name;int score;bool operator<const Info &a) const{return a.score < score;}
}

---------------------------------------------------------------------------------------------

补充:

C++容器分为顺序容器和关联性容器:

    顺序容器包括vector、deque、list、forward_list、array、string,所有顺序容器都提供了快速顺序访问元素的能力。

    关联容器包括set、map的关联型容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的。

    关联容器不支持顺序容器的位置相关的操作。原因是关联容器中元素是根据关键字存储的,这些操作对关联容器没有意义。

而且,关联容器也不支持构造函数或插入操作这些接受一个元素值和一个数量值得操作。

    关联容器支持高效的关键字查找和访问

    map中的元素是一些关键字----值(key--value)对:关键字起到索引的作用,值则表示与索引相关联的数据。

    set中每个元素只包含一个关键字:set支持高效的关键字查询操作----检查一个给定关键字是否在set中。

    set封装的二叉树,所以它支持插入数据的排序,它是关联式容器,存储同一数据类型,set中的每一个元素都是唯一的,系统会根据元素的值自动进行排序。

    它们内部采用的是平衡检索二叉树:红黑树,它的统计性能要好于一般的平衡二叉树。

1)map和set的插入删除效率要比其他序列容器高

    对于关联容器来说,不需要内存拷贝和移动。

    set容器所有元素都是以节点的方式来存储,节点结构和链表相似,指向父节点和子节点。插入和删除的时候改变的都是指针,不会移动内存。

2)每次insert之后,以前保存的iterator不会失效。

    iterator等价于指向节点的指针,其内存没有发生变化,指向内存的指针也不会出现失效的情况。

    对于vector来说,每一次插入和删除都有可能使指针失效,即使在尾部插入也是 如此。

    这是因为为了保证内部数据的连续存放,iterator指向的那块内存在删除和插入的过程可能已经被其他内存覆盖和释放了。

    即使是用push_back的时候,容器的存储空间可能不够,需要一块更大的内存。

    只有把以前的内存释放掉,申请更大的内存,复制已有的数据元素到新的内存,最后把需要插入的元素放到最后。

   那么以前的内存指针必然不可再用了。

3)当元素增多的时候,set的插入和搜索速度变化是不变的。   红黑树的查找时间复杂度都是logN。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

未完待续

 

转载于:https://www.cnblogs.com/wanghao-boke/p/10483967.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/385101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

表示数值的字符串

题目描述 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。例如&#xff0c;字符串"100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","…

数据库简单实用(一)

一、实验环境&#xff1a; MySQL 2.7.22 xfce终端 二、开发准备 打开MySQL服务并使用root登录 sudo service mysql start //打开mysql服务 mysql -u root //使用root用户登录&#xff0c;密码为空 -u和root之间可以不用空格 三、实验步骤 //如果在操作中忘掉&#xff1b;可以使…

lambda 表达式定制操作

泛型算法中的定制操作 许多算法都会比较输入序列中的元素以达到排序的效果&#xff0c;通过定制比较操作&#xff0c;可以控制算法按照编程者的意图工作。 普通排序算法&#xff1a;template<class RandomIterator> void sort(RandomIterator first,RandomIterator last)…

包含min函数的栈

题目描述 定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈中所含最小元素的min函数&#xff08;时间复杂度应为O&#xff08;1&#xff09;&#xff09;。 解法&#xff1a; class Solution { public:stack<int> s;stack<int> s_min;void push(int v…

01-复杂度3 二分查找 (20 分)

本题要求实现二分查找算法。 函数接口定义&#xff1a; Position BinarySearch( List L, ElementType X );其中List结构定义如下&#xff1a; typedef int Position; typedef struct LNode *List; struct LNode {ElementType Data[MAXSIZE];Position Last; /* 保存线性表中最后…

二叉树的镜像

题目描述 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义&#xff1a;源二叉树 8/ \6 10/ \ / \5 7 9 11镜像二叉树8/ \10 6/ \ / \11 9 7 5 解法&#xff1a; /* struct TreeNode {int val;struct TreeNode *left;struct Tre…

01-复杂度1 最大子列和问题 (20 分)

给定K个整数组成的序列{ N​1​​, N​2​​, ..., N​K​​ }&#xff0c;“连续子列”被定义为{ N​i​​, N​i1​​, ..., N​j​​ }&#xff0c;其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 }&#x…

300. 最长上升子序列

给定一个无序的整数数组&#xff0c;找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101]&#xff0c;它的长度是 4。 说明: 可能会有多种最长上升子序列的组合&#xff0c;你只需要输出对应的长度即可。 你算法…

02-线性结构1 两个有序链表序列的合并 (15 分)

本题要求实现一个函数&#xff0c;将两个链表表示的递增整数序列合并为一个非递减的整数序列。 函数接口定义&#xff1a; List Merge( List L1, List L2 );其中List结构定义如下&#xff1a; typedef struct Node *PtrToNode; struct Node {ElementType Data; /* 存储结点数据…

50. Pow(x, n)

实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数。 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, 3 输出: 9.26100 示例 3: 输入: 2.00000, -2 输出: 0.25000 解释: 2-2 1/22 1/4 0.25 说明: -100.0 < x < 100.0 n 是 32 位有符号整数&…

01-复杂度2 Maximum Subsequence Sum (25 分)

Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A continuous subsequence is defined to be { N​i​​, N​i1​​, ..., N​j​​ } where 1. The Maximum Subsequence is the continuous subsequence which has the largest sum of its elements.…

进制转换习题

题目&#xff1a;进制转换 解法&#xff1a; #include <iostream> #include <vector> #include <algorithm> using namespace std; long long nums, k;void solution(long long nums, long long k) {vector<int> res;while(nums){long long curr nu…

02-线性结构2 一元多项式的乘法与加法运算 (20 分)

设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行&#xff0c;每行分别先给出多项式非零项的个数&#xff0c;再以指数递降方式输入一个多项式非零项系数和指数&#xff08;绝对值均为不超过1000的整数&#xff09;。数字间以空格分隔。 输出格式: 输出分2行&…

《Leetcode | 02》

序号题目类型标记 863. 二叉树中所有距离为 K 的结点 ★ 94. 二叉树的中序遍历 ★ 102. 二叉树的层次遍历 144. 二叉树的前序遍历 450. 删除二叉搜索树中的节点 701. 二叉搜索树中的插入操作 700. 二叉搜索树中的搜索 108. 将有序数组转换为二叉搜索树 701. …

C++基础:各种输入方法总结

输入原理简述&#xff1a; 程序的输入都建有一个缓冲区&#xff0c;即输入缓冲区。每次输入过程是这样的&#xff0c;当一次键盘输入结束时会将输入的数据存入输入缓冲区&#xff0c;而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的&#xff0c;所以…

04-树7 二叉搜索树的操作集 (30 分)

本题要求实现给定二叉搜索树的5种常用操作。 函数接口定义&#xff1a; BinTree Insert( BinTree BST, ElementType X ); BinTree Delete( BinTree BST, ElementType X ); Position Find( BinTree BST, ElementType X ); Position FindMin( BinTree BST ); Position FindMax( B…

02-线性结构3 Reversing Linked List (25 分)

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K3, then you must output 3→2→1→6→5→4; if K4, you must output 4→3→2→1→5→6. Input Specifi…

03-树1 树的同构 (25 分)

给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2&#xff0c;则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的&#xff0c;因为我们把其中一棵树的结点A、B、G的左右孩子互换后&#xff0c;就得到另外一棵树。而图2就不是同构的。 图1 图2 现给定两棵…

【树】104. 二叉树的最大深度

题目 104. 二叉树的最大深度 方法1 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr),…

Leetcode 206. 反转链表

206. 反转链表 解法1 class Solution { public:ListNode *reverseList(ListNode *head){if(!head || !head->next)return head;ListNode *p;p reverseList(head->next);head->next->next head;head->next nullptr;return p;} };解法2 /*** Definition for…