set容器

实战c++中的vector系列--copy set to vector(别混淆了reserve和resize)

人走茶凉 提交于 2020-02-18 07:03:39
stl算法中有个copy函数。我们能够轻松的写出这种代码: #include <iostream> #include <algorithm> #include <vector> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { double darray[10]={1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9}; vector<double> vdouble(10); vector<double>::iterator outputIterator=vdouble.begin(); copy(darray,darray+10,outputIterator); while(outputIterator!=vdouble.end()) { cout<<*outputIterator<<endl; outputIterator++; } getchar(); return 0; } 于是你想使用copy来set to vector,于是你这样写道: #include<iostream> #include<vector> #include<set> int main() { std::set <double> input; input.insert(5); input.insert(6);

STL中vector,Map,Set的实现原理

天大地大妈咪最大 提交于 2020-02-17 11:52:15
vector的数据安排以及操作方式,与array非常类似,两者唯一的区别是空间运用的灵活性,array是静态空间,一旦配置了就不能改变,如果你想要大一点的空间,就必须首先配置一块新空间,然后将原来的元素一一复制进来,再把原来的空间释放给系统。但是vector是动态空间,随着元素的增加,它的内部机制会自行扩充空间以容纳新元素,因此vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块头的array了,我们可以安心使用vector,随便使用多大空间都可以 vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率,一旦vector的旧有空间满载,如果客户端每新增一个元素,vector的内部只是扩充一个元素的空间,实为不智,因为所谓扩充空间,都是配置新空间,复制原来内容,释放旧空间所需要的时间很多,那么应该怎样配置空间呢,接下来再说。 并且vector维护的是一个连续线性空间,所以支持vector随机存取 注意: vector动态增加大小时,并不是在原空间之后持续新空间(因为根本无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间,因此,一旦引起空间重新配置,指向原vector的所有迭代器都失效了

c++ STL中的set和multiset

陌路散爱 提交于 2020-02-17 11:32:28
1.结构 set和multiset会根据特定的排序原则将元素排序。两者不同之处在于,multisets允许元素重复,而set不允许重复。 set中的元素可以是任意类型的,但是由于需要排序,所以元素必须有一个序,即大小的比较关系,只要是assignable、copyable、comparable(根据某个排序准则)的型别T,都可以成为set或者multisets的元素。 2.底层实现 和所有的标准关联容器类似,sets和multisets通常以平衡二叉树完成。 自动排序的主要优点在于使二叉树搜寻元素具有良好的性能,在其搜索函数算法具有对数复杂度。但是自动排序也造成了一个限制,不能直接改变元素值,因为这样会打乱原有的顺序,要改变元素的值,必须先删除旧元素,再插入新元素。所以sets和multisets具有以下特点: -不提供直接用来存取元素的任何操作元素。 -通过迭代器进行元素的存取。 3.成员函数 begin()--返回指向第一个元素的迭代器 clear()--清除所有元素 count()--返回某个值元素的个数 empty()--如果集合为空,返回true end()--返回指向最后一个元素的迭代器 equal_range()--返回集合中与给定值相等的上下限的两个迭代器 erase()--删除集合中的元素 find()--返回一个指向被查找到元素的迭代器 get

codeforce div2 620 B. Longest Palindrome

这一生的挚爱 提交于 2020-02-16 14:31:14
题意很好理解,就是有若干个长度已知各不相同的字符串,让我们组成一个尽可能长的回文串,刚开始我找错了方向,想着转换成26进制在暴力找解的方法,后发现不太可行,看到标称里那么多stl,直接用一些c++内置功能完成了题目的求解,首先是set去复制一份字符串的值,直接用其内置的find函数确实是否有合适的值,在这里有一个点很有意思,find函数在找不到这个的位置时,会自动返回end所以判断是否存在回文可以用.find!=.end。这是个很有趣的应用,查了很久才了解到这个用法,其次既然不常用set,在这里我也简单介绍一些第一次用到的set功能earse可以删去这个元素的迭代器,set容器还提供自动排序和去重的功能,可以存储多种类型的数据,之后因为这道题所有字符串均不同,所以我们需要考虑自身是回文串的串,随便选一组放在中间。使用vactor去存前半部分和后半部分,使用c++内置的reverse来翻转字符串。最后在介绍一个c++的语法for(x:y)的意义是遍历所有y中的x; 题解写到这里,也算发现这道题其实大部分内容都是靠c++内置功能实现的,所以我们要更熟练的使用这些数据结构 下面代码 # include <bits/stdc++.h> using namespace std ; string s [ 100 ] ; int mian ( ) { set < string > awsd ;

pat a 1121

心不动则不痛 提交于 2020-02-13 00:36:17
首先将各对couple的关系存入map映射中,然后用一个exsit数组来记录一下都有谁到场了,同时把到场的人放进set容器中。 然后对set进行一次遍历,删除那些他的对象到场的人,最后输出就好,set已经自动帮咱们排了序 # include <iostream> # include <unordered_map> # include <set> using namespace std ; const int maxv = 100010 ; int exsit [ maxv ] = { 0 } ; int main ( ) { int n ; cin >> n ; unordered_map < int , int > mp ; set < int > se ; for ( int i = 0 ; i < n ; i ++ ) { int id1 , id2 ; cin >> id1 >> id2 ; mp [ id1 ] = id2 ; mp [ id2 ] = id1 ; } int k ; cin >> k ; for ( int i = 0 ; i < k ; i ++ ) { int id ; cin >> id ; exsit [ id ] = 1 ; se . insert ( id ) ; } for ( auto it = se . begin ( ) ; it !

Python基础语法三组合数据类型

断了今生、忘了曾经 提交于 2020-02-10 00:31:42
一、列表(Lists) 列表属于Python中的序列类型,它是任意对象的有序集合,通过 “ 位置 ”或者 “ 索引 ” 访问其中的元素,它具有可变对象、可变长度、异构和任意嵌套的特点。 列表里第一个元素的为值或者索引是从 “ 0 ” 开始,第二个元素则是 “ 1 ”,一次类推。 列表的元素放置在方括号 [] 中,以逗号来分隔各元素; 格式如下: listname = [元素1,元素2,元素3,...,元素n ] 1 1 listname = [元素1,元素2,元素3,...,元素n ] 例: sample_list1 = [1,2,3,4] sample_list2 = ["P","y","t","h","o","n"] sample_list3 = ['Python','sample','list','for','your','reference'] print(sample_list1) print(sample_list2) print(sample_list3) 6 1 sample_list1 = [1,2,3,4] 2 sample_list2 = ["P","y","t","h","o","n"] 3 sample_list3 = ['Python','sample','list','for','your','reference'] 4 print(sample

关联式容器

点点圈 提交于 2020-02-08 17:04:57
目录 容器rb_tree rb_tree的实现代码 rb_tree的结构 rb_tree的noede结构 set/multiset set的定义 set的代码实现 set的操作分析 set内部数据结构图 map/multimap map的性质 map的实现 map的内部数据结构图 map数据结构的组成 容器rb_tree Red-Black tree(红黑树)是平衡二叉搜索树(balanaced binary search tree)中常被使用的一种。平衡二叉搜索树的特征:排列规则有利于search和insert,并保持适度平衡——无任何节点过深。 rb_tree提供遍历操作及iterators。按正常规则(++ite)遍历,便能获得排序状态。 我们不应使用rb_tree的iterators改变元素值(因为元素有其排列规则)。编程层面并未阻值此事。如此设计是正确的,因为rb_tree即将为set和map服务(作为其底部支撑),而map允许元素的data被改变,只有元素的key才是不可被改变的。 rb_tree提供两种insert操作:insert_unique()和insert_equal()前者表示节点的key一定在整个tree中独一无二,否则安装失败,后者表示节点的key可以重复。 rb_tree的实现代码 namespace rb_tree{ template <class

JAVA中的集合框架(上)List

╄→гoц情女王★ 提交于 2020-02-07 06:56:58
第一节 JAVA中的集合框架概述 集合的概念,现实生活中:很多事物凑在一起就是一个集合;数学中的集合:具有相同属性事物的总体;JAVA中的集合:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象。集合的作用:在类的内部,对数据进行组织(如果有些属性类型相同,但意义与作用不同,咱们就不能把它们放到集合,如学生的姓名和性别属性),简单而快速的搜索大数量的条目。 有的集合接口,提供了一系列排列有序的元素,并且可以在序列中间快速的插入或者删除有关元素; 有的集合接口,提供了映射关系,可以通过关键字key去快速查找到对应的唯一对象,而这个关键字可以是任意类型。 集合其实就是用来承装其它对象的容器。 与数组相比,为何选择集合而不是数组?数组的长度固定,还得复制,集合的长度可变。数组只能通过数组下标访问元素,类型固定,而有的集合可以通过任意类型查找所映射的具体对象,数组还要遍历元素比较麻烦。 集合的框架体系结构: 将collection想象成单身宿舍,三个子接口。 1.List(序列):排列有序,可重复 2.Queue(队列):排列有序,可重复 3.set(集):无序,不可重复 将map当成成对出现,Collection 是存储的一个一个的对象,而Map提供映射的关系,内部以的Key,Value两个对象为一个映射来存储数据,Entry类(键值对)是Map的内部类,Key

数据结构--二叉搜索树2

浪尽此生 提交于 2020-02-06 16:45:50
之前我们实现了简单的二叉搜索树,现在介绍一下,STL中的容器,应对需要使用二叉搜索树的情况其实,大多数时候,用STL中的set就够了,不需要自己实现 1 #include <iostream> 2 #include <cstdio> 3 #include <set> 4 5 using namespace std; 6 7 // set的内部结构其实不只是搜索二叉树那么简单 8 // set是一种自平衡二叉查找树,名叫红黑树 9 // 如果要对复杂的数据进行操作,需要重写仿函数,来进行大小的确定 10 11 int main() 12 { 13 set<int> s; 14 15 s.insert(1); 16 s.insert(3); 17 s.insert(6); 18 s.insert(5); 19 20 set<int>::iterator it; 21 22 it=s.find(3); 23 24 if(it==s.end()) 25 { 26 puts("find error\n"); 27 } 28 else 29 { 30 puts("find it\n"); 31 } 32 33 s.erase(3); 34 35 it=s.find(3); 36 37 if(it==s.end()) 38 { 39 puts("find error\n"); 40 } 41

C++中STL常用容器的优点和缺点

北战南征 提交于 2020-02-06 05:59:06
【转】 C++中STL常用容器的优点和缺点 我们常用到的 STL 容器 有vector、list、deque、map、multimap、set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我们了解清楚。 verctor vector类似于C语言中的数组,它维护一段连续的内存空间,具有固定的起始地址,因而能非常方便地进行随机存取,即 [] 操作符,但因为它的内存区域是连续的,所以在它中间插入或删除某个元素,需要复制并移动现有的元素。此外,当被插入的内存空间不够时,需要重新申请一块足够大的内存并进行内存拷贝。值得注意的是,vector每次扩容为原来的两倍,对小对象来说执行效率高,但如果遇到大对象,执行效率就低了。 #include<iostream> #include<cstdio> #include<vector> using namespace std; vector<int> a;//大概能开3e7个vector vector<int> b; int main(){ int x=10; a.push_back(x);//插到末尾 a.push_back(x=20); a.insert(a.end(),x=40); //相当于push_back a.insert(a.begin()+1,30); //插到任何一个位置 a