C++/STL 本是古典 何须时尚 2022-08-18 12:10 110阅读 0赞 #### 迭代器iterator #### ##### 从后向前的迭代器 ##### > vector test; > vector::reverse\_iterator iter; > for(iter=test.rbegin();iter!=test.rend();++iter) ##### const\_iterator只能读取数据,不能修改 ##### > for(vector::const\_iterator iter=test.begin();iter!=test.end();++iter) #### Vector #### > //删除指定位置的数据,返回下一个数据的位置 > iterator erase(iterator position); > //删除\[begin,end) > iterator erase(iterator begin,iterator end); > 要删除一个vector连续的某个数值,注意写法为: > for(vector::iterator iter=test.begin();iter!=test.end();) > \{ > if(\*iter==24) > \{ > test.erase(iter); > \} > else\{ > iter++; > \} > \} > 或者 > `#`include`<`algorithm> > test.erase(remove(test.begin(),test.end(),24),test.end()); > 获得vector中数据的个数 > int nSize== test.empty() ? -1 : static\_cast(test.size()); #### List #### list的节点无需分配指定的内存大小且可以任意伸缩,因为它存储在非连续的内存空间中,因此可以快速地插入删除而不能随机访问。 > //合并两个list > //将l2添加到l1的末尾 > l1.merge(l2); > //指定添加的位置iter > l1.splice(iter,l2); list的unique是比较相邻的元素,去掉相邻元素中重复。要去除所有重复的元素,要先对容器中的元素排序sort。 vector是一段连续的内存块,而deque是多个连续的内存块,list是所有元素分开保存。如果需要随机存取又关心两端数据的插入和删除,deque是最好的。 #### 关联容器 #### set、multiset、map、multimap是非线性的树结构(红黑树)。 set通过链表的方式组织。 #### 容器适配器 #### STL中包含三种适配器,栈stack、队列queue和优先级priority\_queue。适配器保存元素的机制是调用一种顺序容器去实现。默认情况下,stack和queue基于deque实现,priority\_queue基于vector实现,在创建一个适配器时可以指定具体的实现容器,但是由于适配器的特点,一个适配器不是可以由任意一个顺序容器都可以实现。 栈stack关联的容器可以是任意一种顺序容器。 队列queue关联的容器必须提供pop\_front操作, 其不能使用vector。 > deque`<`int> container(5,10); > stack`<`int>=mystack(container); #### Efficient STL #### 一、当对象很大时,建立指针的容器而非对象的容器。STL基于拷贝的方式来工作,任何需要放入STL中的元素,都会被复制。 1.容器销毁前需要手动销毁指针所指向的对象,否则会造成内存泄露。 2.使用排序等算法时,需要构造基于对象的比较函数。此时默认的比较函数是基于指针大小的比较。 二、使用empty()函数检查是否为空,不要使用size()。对于List,size()会遍历每一个元素来确定大小。 三、对于Vector,新增元素时空间不够,会执行: 1.分配当前空间的两倍空间。 2.将当前元素拷贝到新的空间中。 3.释放之前的空间,将新元素写入新空间指定位置。 使用vector,最后事先确定大小。 四、
还没有评论,来说两句吧...