stl

C++ STL 复习

戏子无情 提交于 2020-02-07 20:46:24
1. Vector 1.1 基本函数 1.1.1 构造函数 vector():创建一个空vector vector(int nSize):创建一个vector,元素个数为nSize vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t vector(const vector&):复制构造函数 vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中 1.1.2 插入函数 void push_back(const T& x):向量尾部增加一个元素X iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据 1.1.3 删除函数 iterator erase(iterator it):删除向量中迭代器指向元素 iterator erase(iterator first

STL容器与算法(一)容器的简介

穿精又带淫゛_ 提交于 2020-02-07 07:20:21
STL容器 STL容器包括 顺序式容器 和 关联式容器 。 顺序式容器 顺序容器包括:可变长动态数组 vector、双端队列 deque、双向链表 list、队列queue、有限队列priority_queue、栈stack等吗,特点如下: vector:动态数组,从末尾能快速插入与删除,直接访问任何元素。 list:双链表,从任何地方快速插入与删除。 deque:双向队列,从前面或后面快速插入与删除,直接访问任何元素。 queue:队列,先进先出。 priority_queue:优先队列,最高优先级元素总是第一个出列。 stack:栈,后进后出。 它们之所以被称为顺序容器,是因为元素在容器中的位置同元素的值无关,即容器不是排序的。将元素插入容器时,指定在什么位置(尾部、头部或中间某处)插入,元素就会位于什么位置。 关联式容器 关联式容器包括set、multiset、map、multimap等。 set:集合,快速查找,不允许重复值。 multist:快速查找,允许重复值。 map:一对多映射,基于关键字快速查找,不允许重复值。 multimap:一对多映射,基于关键字快速查找,允许重复值。 任何两个容器对象,只要它们的类型相同,就可以用<、<=、>、>=、==、!=进行比较运算。 例如假设a、b是两个类型相同的容器对象,其规则如下: a == b:若 a 和 b 中的元素个数相同

高效使用STL

烈酒焚心 提交于 2020-02-07 07:10:47
高效使用STL 参考:http://blog.jobbole.com/99115/ 仅仅是个选择的问题,都是STL,可能写出来的效率相差几倍; 熟悉以下条款,高效的使用STL; 当对象很大时,建立指针的容器而不是对象的容器 1)STL基于拷贝的方式的来工作,任何需要放入STL中的元素,都会被复制; 这也好理解,STL工作的容器是在堆内开辟的一块新空间,而我们自己的变量一般存放在函数栈或另一块堆空间中;为了能够完全控制STL自己的元素,为了能在自己的地盘随心干活;这就涉及到复制; 而如果复制的对象很大,由复制带来的性能代价也不小 ; 对于大对象的操作,使用指针来代替对象能消除这方面的代价; 2)只涉及到指针拷贝操作, 没有额外类的构造函数和赋值构造函数的调用; vecttor vt1; vt1.push_bach(myBigObj); vecttor vt2; vt2.push_bach(new BigObj()); 注意事项: 1)容器销毁前需要自行销毁指针所指向的对象;否则就造成了内存泄漏; 2)使用排序等算法时,需要构造基于对象的比较函数,如果使用默认的比较函数,其结果是基于指针大小的比较,而不是对象的比较; 用empty() 代替size()来检查是否为空 因为对于list,size()会遍历每一个元素来确定大小,时间复杂度 o(n),线性时间;而empty总是保证常数时间;

C++语法基础之STL集合类

落花浮王杯 提交于 2020-02-07 05:03:58
set 和 multiset 头文件:< set > 内部使用类似二叉树的方式实现,不能够替换或者直接修改指定位置的元素,但是能够对元素进行排序并实现快速查找建。 实例化 默认谓词:std::less,实现升序排列 实例化一个升序排列的set或者multiset(也可以直接greater< type >) // used as a template parameter in set / multiset instantiation template < typename T > struct SortDescending { bool operator ( ) ( const T & lhs , const T & rhs ) const { return ( lhs > rhs ) ; } } ; set < int , SortDescending < int >> setInts ; multiset < int , SortDescending < int >> msetInts ; 此外,还可以直接使用其他set、multiset、vector、list或者其他STL容器初始化 插入 使用成员函数insert() 参数是要插入的值或者指定范围 setInts . insert ( - 1 ) ; msetInts . insert ( setInts . begin (

【STL 基本容器】

淺唱寂寞╮ 提交于 2020-02-06 23:01:49
1.顺序容器与关联容器 c++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector、list、deque等。其中vector表示一段连续的内存地址,基于数组的实现,list表示非连续的内存,基于链表实现。deque与vector类似,但是对于首元素提供删除和插入的双向支持。关联容器主要有map和set。map是key-value形式的,set是单值。map和set只能存放唯一的key值,multimap和multiset可以存放多个相同的key值。 2.顺序容器 (1) vector 内部数据结构:数组。 随机访问每个元素,所需要的时间为常量。 在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。 可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存。 vector的迭代器在内存重新分配时将失效(它所指向的元素在该操作的前后不再相同)。当把超过capacity()-size()个元素插入vector中时,内存会重新分配,所有的迭代器都将失效;否则,指向当前元素以后的任何元素的迭代器都将失效。当删除元素时,指向被删除元素以后的任何元素的迭代器都将失效。 (2)deque 内部数据结构:数组。 随机访问每个元素,所需要的时间为常量。 在开头和末尾增加元素所需时间与元素数目无关

VTK中获取STL模型点的坐标以及对其进行变换

纵饮孤独 提交于 2020-02-06 13:26:48
  VTK是一个基于面向对象的开源三维绘图软件包,和其它的的三维绘图引擎如OSG、OGRE不同之处在于, VTK可视化对象主要是各种数据,更加注重对数据分析处理后的可视化 ,可视化的内容是人们无法直接感受到的东西,如地质构造、地层分布、矿床分布、三维空间应力场的状态变化等等,而OSG、OGRE是基于场景的可视化,更强调视觉感官的感受,所以OSG主要应用于虚拟现实领域,而VTK主要应用于科学计算可视化领域。   VTK的可视化设计是基于管线流的设计模式,将要处理的数据作为流动介质在管线中流动,不同的阶段对数据有不同的处理方式,VTK的可视化管线如图所示:   Sources: 数据生成的源头,数据来源主要包括从磁盘读取数据文件,如VTK所支持的各种格式文件生成数据源对象,这种源对象被称为读源对象,或者利用数学方法生成源对象,如利用多个四边形构建一个圆柱体,这种对象被称为程序源对象。   Filters: 对源对象进行处理,生成新的数据集输出。   Mappers: 映射器对象主要作用是将可视化模型生成的数据转换到图形模型进行绘制,或者以磁盘文件的形式进行输出。   渲染对象(vtkRenderer)和渲染窗口(vtkRenderWindow): 渲染对象和渲染窗口分别对应于用于显示图形的视口和窗口。每个渲染窗口可以容纳一个或多个渲染对象。即一个渲染窗口中可以存在多个视口

STL 常用遍历算法 for_each()

邮差的信 提交于 2020-02-06 11:42:21
STL 常用遍历算法 头文件 #include < algorithm> 用for_each(iterator beg,iterator end,_func)函数 beg 开始迭代器 end 结束迭代器 _func 函数或者函数对象 具体方法1:(函数) # include <iostream> # include <algorithm> # include <vector> using namespace std ; //普通函数 void print ( int val ) { cout << val << " " ; } //常用遍历算法 int main ( ) { vector < int > v ; for ( int i = 0 ; i < 10 ; i ++ ) v . push_back ( i ) ; for_each ( v . begin ( ) , v . end ( ) , print ) ; //这里只需要添加函数名即可 return 0 ; } 2:(函数对象) # include <iostream> # include <algorithm> # include <vector> using namespace std ; //函数对象 class print { public : void operator ( ) ( int val ) {

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

stl 中List vector deque区别

一个人想着一个人 提交于 2020-02-06 05:43:53
stl提供了三个最基本的容器:vector,list,deque。 vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此 它能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间 进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新 申请一块足够大的内存并进行内存的拷贝。这些都大大影响了vector的效率。 list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间可以是不连续 的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它 没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除 和插入。 deque是一个double-ended queue,它的具体实现不太清楚,但知道它具有以下两个特点: 它支持[]操作符,也就是支持随即存取,并且和vector的效率相差无几,它支持在两端的 操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率 也差不多。 因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面 的原则: 1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector 2、如果你需要大量的插入和删除,而不关心随即存取

STL中二分查找函数——binary_search//lower_bound//upper_bound//equal_range

无人久伴 提交于 2020-02-06 05:29:52
以下函数均需配合头文件< algorithm>和sort函数排序后使用 lower_bound int lower_bound(start,end,num); 返回值是int类型,返回的是一个指针,意义是在[start,end)范围内第一次遇到 大于或等于 num的下标。 upper_bound int upper_bound(start,end,num); 返回值是int类型,返回的是一个指针,意义是在[start,end)范围内第一次遇到 大于却不等于 num的下标。 binary_search bool binary_search(start,end,num); 返回值是bool类型,意义是在[start,end)范围内是否有num equal_range pair upper_bound(start,end,num); 返回值是pair类型,返回pair< i , j > 。意义是在[ i , j )区间上的数都等于num,相当于是lower_bound和upper_bound的结合 以上函数都是以二分为实现在已排好序的数组或容器中查找的函数,当返回值意义各不相同 (图片来自https://blog.csdn.net/u010700335/article/details/41323427) 来源: CSDN 作者: TSD_captain 链接: https://blog