rit

STL--set使用用法

我们两清 提交于 2020-04-01 05:22:03
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器。( 相同的值不存,存进去自动排序好了 ) set/multiset会根据待定的排序准则,自动将元素排序 。两者不同在于 前者不允许元素重复(重复元素只操作一遍,其他的忽略处理), 而后者允许。(因为插入的时候,它们分别调用的是insert和unique_insert) 同理,map和multimap也是这个意思。set、map它们的 底层都是基于红黑树 。 set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。 平衡二叉检索树的检索使用中序遍历算法,检索效率高于vector、deque、和list的容器。另外,采用中序遍历算法可将键值由小到大遍历出来,所以,可以理解为平衡二叉检索树在插入元素时,就会自动将元素按键值从小到大的顺序排列。 set的各成员函数列表如下: c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器 c++ stl容器set成员函数:clear()--清除所有元素 c++ stl容器set成员函数:count()--返回某个值元素的个数 c++ stl容器set成员函数:empty()--如果集合为空

PAT乙级真题 1083 是否存在相等的差 C++实现(用map记录,反向遍历map)

≡放荡痞女 提交于 2020-01-29 05:16:08
题目 给定 N 张卡片,正面分别写上 1、2、……、N,然后全部翻面,洗牌,在背面分别写上 1、2、……、N。将每张牌的正反两面数字相减(大减小),得到 N 个非负差值,其中是否存在相等的差? 输入格式: 输入第一行给出一个正整数 N(2 ≤ N ≤ 10 000),随后一行给出 1 到 N 的一个洗牌后的排列,第 i 个数表示正面写了 i 的那张卡片背面的数字。 输出格式: 按照“差值 重复次数”的格式从大到小输出重复的差值及其重复的次数,每行输出一个结果。 输入样例: 8 3 5 8 6 2 1 4 7 输出样例: 5 2 3 3 2 2 思路 用 map 记录每个差的个数(也可以用 vector ),map自动按key从小到大排序,最后反向遍历map输出key大于1的结果即可。 map 反向遍历语法为: for ( map < int , int > :: reverse_iterator rit = countMap . rbegin ( ) ; rit != countMap . rend ( ) ; ++ rit ) { cout << rit - > first << " " << rit - > second << endl ; } 代码 # include <iostream> # include <map> using namespace std ; int

C++:Array

可紊 提交于 2020-01-16 04:45:36
Array是固定大小的容器,定义时要显式的指定大小。 可以修改array中元素的值,但不能向array中插入和删除元素. array在栈上为元素分配内存。 array<TYPE, SIZE> swap(arr1,arr2);  //具有线性时间复杂度 arr1.swap(arr2); .fill(VALUE)  //填充值 .size() Iterators begin Return iterator to beginning (public member function ) end Return iterator to end (public member function ) rbegin Return reverse iterator to reverse beginning (public member function ) rend Return reverse iterator to reverse end (public member function ) cbegin Return const_iterator to beginning (public member function ) cend Return const_iterator to end (public member function ) crbegin Return const_reverse

【日常训练】简单的字符串

半城伤御伤魂 提交于 2019-12-05 17:47:49
Problem 求长度为 \(n\) 的、字符集大小 \(5000\) 的串有多少个偶数长的子串前一半和后一半循环同构。 \(n \leq 5000\) Solution 分析 问题即为求有多少个子区间可以表示成 \(uvvu\) ( \(|u|\neq 0\) , \(|v|\) 可以为 \(0\) )的形式。 我们发现,如果以两个 \(v\) 作为中心,从中心分别向两边扩展,从这个过程可以得到两个字符串 \(a=v^Ru^R,b=vu\) ( \(u^R\) 表示 \(u\) 的反转),那么 \(s=a_1b_1a_2b_2\dots a_nb_n\) 这个串相当于是 \(v\) 和 \(v^R\) 交错拼起来, \(u\) 和 \(u^R\) 交错拼起来,然后再把这两个得到的字符串连起来。那么 \(s\) 这个串相当于两个 偶回文串 拼接而成。 考虑枚举中心,然后得到向两边扩展的字符串 \(a,b\) ,两个字符串都只保留前缀 \(1\dots \min\{|a|,|b|\}\) ,然后根据上面的方式得到字符串 \(s\) 。那么我们就是需要统计, \(s\) 有多少个前缀,能够表示成两个 偶回文串 拼接而成的结果(注意特判只有 \(|v|=0\) )。 Lemma 1: 对于一个 双回文串 \(s\) (能够表示成两个非空回文串拼接的结果),若 \(s=x_1x_2=y

Set容器

岁酱吖の 提交于 2019-11-27 12:37:08
set集合容器: 实现了红黑树(Red-Black Tree)的平衡二叉检索树的数据结构,在插入元素时, 它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点的键值, 而小于右子树所有节点的键值;另外,还得确保根节点的左子树的高度与有字数的高度相等, 这样,二叉树的高度最小,从而检索速度最快。要注意的是,它不会重复插入相同键值的元素,而采取忽略处理。 平衡二叉检索树的检索使用中序遍历算法,检索效率高于vector、deque、和list的容器。 另外,采用中序遍历算法可将键值由小到大遍历出来,所以,可以理解为平衡二叉检索树在插入元素时, 就会自动将元素按键值从小到大的顺序排列。 构造set集合的主要目的是为了快速检索,使用set前,需要在程序头文件中包含声明“#include<set>”。 c++ stl集合(Set): 是一种包含已排序对象的关联容器。set/multiset会根据待定的排序准则, 自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。 1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素 2) 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数 3) 元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同)