stl

stl list

心不动则不痛 提交于 2020-02-21 10:08:59
#include <list> #include <stdio.h> #include <algorithm> #include "listEx.h" using namespace std; typedef struct { char name[100]; int age; char address[100]; }STUDENT; typedef list<STUDENT> STUDENTLIST; class EventIsIn11 { public: bool operator () (STUDENT &student) { return student.age == 13; } }; int comp(int n1,int n2) { return n1>n2; } int erasecom(int n) { return n<=3; } int main() { //初始化 list<int> c1(3); //建一个含三个默认值是0的元素的链表 list<int> c2(5,2); //建一个含五个元素的链表,值都是2 list<int> c4(c2); //建一个c2的copy链表 list<int> c5(c1.begin(),c1.end()); ////c5含c1一个区域的元素[_First, _Last)。 list<int> ListEx; ListEx

math与qmath宏定义重复

假装没事ソ 提交于 2020-02-21 06:59:41
warning C4005: “M_SQRT1_2”: 宏重定义 解决方法: 1.需要在“项目”右键单击,选择“属性”,然后在“C/C++”中的“预处理器”配置组中的“预处理器定义”中加入“_USE_MATH_DEFINES”。 2.在相应的头文件中添加 #define _USE_MATH_DEFINES。 来源: CSDN 作者: STL_LOVE 链接: https://blog.csdn.net/STL_LOVE/article/details/104416446

STL中_Rb_tree的探索

风格不统一 提交于 2020-02-20 06:33:36
我们知道STL中我们常用的 set 与 multiset 和 map 与 multimap 都是基于红黑树。本文介绍了它们的在STL中的底层数据结构 _Rb_tree 的直接用法与部分函数。难点主要是 _Rb_tree 的各个参数的确定。 特别注意在如下代码的 Selector 类用于从 Node 中选出用于排序的key值,这个仿函数必须返回 const int& 而不能是 int ,否则 less<int>::operator(const int&, const int&) 会抛出 segmentation fault 。由于源码中逻辑比较复杂,但是可以观察到内部涉及这方面的地方经常使用到指针。所以可以推测是因为引用了已经释放的局部变量所以才抛出的 segmentation fault 。一开始写成 int ,看了很多源码才发现是这个原因,一定要注意。 接下来是样例代码,里面都有注释了。 #include <iostream> #include <iomanip> // 原则上不要直接引用这个头文件,这里只是为了测试 #include <bits/stl_tree.h> using namespace std; struct Node { int first, second; Node(int _first, int _second) : first(_first),

STL之resize()函数

狂风中的少年 提交于 2020-02-19 07:25:19
size() 目前容器正拥有的元素个数 capacity() 容器能储存的元素个数,即容量 reserve() 重新指定容器能存储数据的个数 resize() 重新指定容器有效的元素个数 设元素原本的v.size()是n 当调用v.resize(m)后,有两种情况: 1.若 m < n ,则只保存容器前m个元素 2.若m > n ,则容器之前储存的n个元素不变,不足m的部分补0 #include <bits/stdc++.h> using namespace std; int main() { int n; while(cin>>n) { vector<int>v; //创建一个空的容器 for(int i=0;i<n;++i) { v.push_back(i); } int m; cin>>m; v.resize(m); cout<<"重新指定后元素个数:"<<v.size()<<endl; for(int i=0;i<m;++i) { cout<<v[i]<<" "; } cout<<endl; } return 0; } 如果希望多出的部分不是补零,而是赋予指定的值,则可以调用v.resize(m,val)将不足的部分用val填充 #include <bits/stdc++.h> using namespace std; int main() { int n; while

STL笔记(3)- Effective STL

大兔子大兔子 提交于 2020-02-18 07:35:11
Effective STL 1: 慎重选择容器类型 2: 不要试图编写独立于容器类型的代码 3: 确保容器中的对象 copy 正确且搞笑 存在继承关系时的 copy 会导致分割 , 可以存储对象指针 . 4: 调用 empty 而不是检查 size() 是否为 0 empty 对所有标准容器是常数时间操作 . size() 返回容器元素个数 , 耗费线性时间. capacity() 返回能够存储的总数 , 对于 vector(type) c, capacity 为 0, 不能赋值 , 必须用 reserve 分配空间 . 5: 区间成员函数优先于与之对应的单元素成员函数 . 避免写显示循环 , 这样减少对象拷贝 , 减少代码 . 1 vector<int> v1, v2; 2 3 //... 4 5 v1.clear(); 6 7 for(vector<int>::const_iterator ci = v2.begin(); ci != v2.end(); ++ci) 8 9 {10 11 v1.push_back(*ci);12 13 }14 15 相当于16 17 v1.assign(v2.begin(), v2.end());18 19 而算法 copy(v2.begin(), v2.end(), back_inserter(v1)); 中尽管没有显示循环 , 但是

STL详细介绍(更新中~~~)

雨燕双飞 提交于 2020-02-17 23:16:27
目录 string string的常见构造函数 string与char *(或const char*)之间的转换 string 转化为const char* const char* 转化为string string 转化为 char* char* 转化为string find函数 string 帮助链接: https://www.jianshu.com/p/497843e403b4 string的常见构造函数 //通过const char * 初始化 string s1 = "aaaa"; //构造函数初始化 string s2("bbbbb"); //通过拷贝构造函数来初始化对象s3 string s3 = s2; //用10个'a'字符来初始化字符串 string s4(10, 'a'); string与char *(或const char*)之间的转换 string 转化为const char* string str("aaaaaaa"); const char *s = str.c_str(); /*str.c_str()返回的应该是const char* 类型*/ const char* 转化为string const char *p1 = "123345"; string str1 = p1; /*直接拷贝*/ //或者这样 string str2(p1);

c++ STL list容器成员函数

一世执手 提交于 2020-02-17 18:31:09
list是一个双链表。 函数 描述 void l.assign (int n, const val) void l.assign (it first, it last) 将链表 l 初始化为 n 个相同的 val 元素。 将链表 l 初始化为从 first 到 last 指针所指向的这一段区域内的元素。 It 指针同 l 是一个类型的。方便将另一个链表中的某一段连续的元素 copy 到新链表。 reference l.back () 返回最后一个元素。经测试,可以直接 l.back()= 元素。 It l.begin() 返回第1 个元素的地址。 Void l.clear() 清空链表。 bool l.empty() 判断链表中是否有元素,若有,返回true 。 It l.end() 返回最后一个元素的下一个元素的地址,即此地址没有实际元素。 it l.erase (it pos);it l.erase (it first, it last); 删除链表中 it 指针所指向的元素,返回被删元素的下一个元素地址。 删除从 first 到 last 这一段的所有元素,返回最后一个被删元素的下一个元素地址。 reference l.front () 返回第一个元素。假如 a=l.front() ,那么 a 只是一个备份,对 a 修改不影响链表。 get_allocator()

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

[STL][C++]MAP

余生长醉 提交于 2020-02-17 11:31:23
参考链接:http://blog.sina.com.cn/s/blog_61533c9b0100fa7w.html map头文件 #include <map> map添加数据; map<int ,string> maplive; 1.maplive.insert( pair<int,string> (102,"aclive")); 2.maplive.insert( map<int,string>::value_type (321,"hai")); 3, maplive[112]="April";//map中最简单最常用的插入添加! map中元素的查找: find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。 map<int ,string >::iterator l_it;; l_it=maplive.find(112); if(l_it==maplive.end()) cout<<"we do not find 112"<<endl; else cout<<"wo find 112"<<endl; map中元素的删除: 如果删除112; map<int ,string >::iterator l_it;; l_it=maplive.find(112); if(l_it==maplive.end()) cout<<"we do not