STL库初探

库:没错误,比框架小,用来解决小问题。

框架:解决开发中某个功能很全。

STL:标准规范,代码不一样,风格,框架有差异

包括:

算法

容器

STL包括:

  1. 容器:容纳数据的结构
  2. 迭代器:扮演容器和算法的胶合剂
  3. 空间配置器:内存空间(动态分配)的分配与管理
  4. 配接器:一种修饰容器的东西:stack,queue,eg:反向迭代器

    更约束,不支持遍历

  5. 算法#include<algorithm>
  6. 仿函数

迭代器:指向一个迭代器,类似指针(一个类型封装的指针)

迭代器失效:类似野指针,和删除有关

erase参数

1.一个位置(迭代器)

2.位置区域(迭代器)

迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeof(vector::iterator)来查看,所占内存并不是4个字节。

首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器失效。那为什么迭代器会失效呢?vector元素在内存中是顺序存储,试想:如果当前容器中已经存在了10个元素,现在又要添加一个元素到容器中,但是内存中紧跟在这10个元素后面没有一个空闲空间,而vector的元素必须顺序存储一边索引访问,所以我们不能在内存中随便找个地方存储这个元素。于是vector必须重新分配存储空间,用来存放原来的元素以及新添加的元素:存放在旧存储空间的元素被复制到新的存储空间里,接着插入新的元素,最后撤销旧的存储空间。这种情况发生,一定会导致vector容器的所有迭代器都失效。

我们看到实现上述所说的分配和撤销内存空间的方式以实现vector的自增长性,效率是极其低下的。为了使vector容器实现快速的内存分配,实际分配的容器会比当前所需的空间多一些,vector容器预留了这些额外的存储区,用来存放新添加的元素,而不需要每次都重新分配新的存储空间。你可以从vector里实现capacity和reserve成员可以看出这种机制。

capacity和size的区别:size是容器当前拥有的元素个数,而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。

vector迭代器的几种失效的情况: 1.当插入(push_back)一个元素后,end操作返回的迭代器肯定失效。 2.当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时first和end操作返回的迭代器都会失效。 3.当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将全部失效。

deque迭代器的失效情况: 在C++Primer一书中是这样限定的: 1.在deque容器首部或者尾部插入元素不会使得任何迭代器失效。 2.在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效。 3.在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效

时间: 2024-10-23 15:20:56

STL库初探的相关文章

如何在android app中使用STL库

方法: 1.在jni目录下新建Application.mk; 加入 APP_STL := stlport_static右边的值还可以换成下面几个: system - 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持 stlport_static - 使用STLport作为静态库,这项是Android开发网极力推荐的 stlport_shared - STLport作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用. gnustl_st

Android NDK STL 库调与 System.load

对于Android可使用的STL库有很多,但gnustl功能无疑是最全面. 百度一下,发现很多人对ndk 使用stl库很不全面,往往gunstl static 过分着墨,因此,我这里之讲述 share库的使用. Application.mk Android.mk ndkstl.cpp 预处理一些函数和变量 然后执行代码 int testVector() { vector<string>  catlst; int i = 0; char temp[MAX_BUFFER_SIZE]; for (i

模拟实现STL库

最近在复习STL,感觉再看的时候比刚开始学的时候通透很多.以前模拟实现了一个STL库,最近复习完又重构了一遍.代码放出来以供后面学习.如果有写的不好的地方欢迎大家批评指正. STL_List.h 1 #pragma once 2 #include"STL_Iterator.h" 3 4 template<class T> 5 struct _List_Node 6 { 7 _List_Node* _prev; 8 _List_Node* _next; 9 T _data;

使用STL库sort函数对vector进行排序

使用STL库sort函数对vector进行排序,vector的内容为对象的指针,而不是对象. 代码如下 1 #include <stdio.h> 2 #include <vector> 3 #include <algorithm> 4 5 using namespace std; 6 7 class Elm 8 { 9 public: 10 int m_iSortProof; 11 12 private: 13 int __m_iValue; 14 static int

STL库---优先队列

题目描述 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了.多多在合并果子时总共消耗的体力等于每次合并所耗体力之和. 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力.假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序

C++标准模板库-STL库基本算法

原文链接:http://blog.csdn.net/wangfengwf/article/details/11580989#t9 16.4  STL库基本算法 标准C++STL库中算法组件为一个很重要的组成部分,该组件提供了大多数最常见的通用算法的实现,并且这些实现是经过很多测试试验并被公认在处理上是高效的.将这些最常见的算法通用化实现,最大的优势就是开发者在应用中不需要为具体的常见算法的实现而费神,只需要包含相应的头文件直接使用即可,不仅仅提高的软件开发的效率,同时还有助于软件重用性的提高.

sort在STL库中是排序函数

sort在STL库中是排序函数,有时冒泡.选择等O(N^2)算法会超时时,我们可以使用STL中的快速排序O(N log N)完成排序 sort在<algorithm>库里面,原型如下: 1 2 3 4 template <class RandomAccessIterator>  void sort ( RandomAccessIterator first, RandomAccessIterator last ); template <class RandomAccessIte

STL库与pb_ds库简单应用

前者不开O2时谨慎使用! 后者尽量不要用! STL库介绍比较多,其中字符串库用的比较少但也应该记住 http://www.cnblogs.com/rvalue/p/7276883.html http://www.cnblogs.com/rvalue/p/7327293.html pb_ds差别不大,但这两个库最大的缺陷就是几乎无法用gdb调试,只能手工输出 下面这个程序运行出来之后就是个小教程 #include<cstdio> #include<vector> #include&l

c++ STL容器初探

什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种"对象"还包含了一系列处理"其它对象"的方法,因为这些方法在程序的设计上会经常被用到,所以容器也体现了一个好处,就是"容器类是一种对特定代码重用问题的良好的解决方案". 容器还有另一个特点是容器可以自行扩展.在解决问题时