Map,Vector,List的简单认识

来源:互联网 发布:做java培训讲师怎么样 编辑:程序博客网 时间:2024/05/01 01:36
vector 与数组类似
   
在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacituy()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储,这给人以vector可以不指定vector即一个连续内存的大小的感觉。通常此默认的内存分配能完成大部分情况下的存储。
   优点:(1) 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组
               进行动态操作。通常体现在push_back() pop_back()
               (2) 随机访问方便,即支持[ ]操作符和vector.at()
               (3) 节省空间。
   缺点:(1) 在内部进行插入删除操作效率低。
               (2) 只能在vector的最后进行push和pop,不能在vector的进行
push和pop。
               (3) 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释

                     放 

需要高效的随即存取,而不在乎插入和删除的效率,使用vector 


vector中与size()capacity() 相对应的有两个函数:resize(size_type)reserve(size_type)

l Size指目前容器中实际有多少元素,对应的resize(size_type)会在容器尾添加或删除一些元素,来调整容器中实际的内容,使容器达到指定的大小。

l Capacity指最少要多少元素才会使其容量重新分配,对应reserve(size_type new_size)会这置这个capacity值,使它不小于所指定的new_size

这两个属性分别对应两个方法:resize()和reserve()。

使用resize(),容器内的对象内存空间是真正存在的。使用reserve()仅仅只是修改了capacity的值,容器内的对象并没有真实的内存空间(空间是"野"的)。此时切记使用[]操作符访问容器内的对象,很可能出现数组越界的问题.当size = capacity后,再向容器里push一个数据,会重新分配一些内存,增加capacity的值,具体增加多少,不同的库不尽相同。




list:
 
   每一个结点都包括一个信息快Info、一个前驱指针Pre、一个后驱指针Post。可以不分配必须的内存大小方便的进行添加和删除操作。使用的是非连续的内存空间进行存储。
   优点:(1) 不使用连续内存完成动态操作。
               
(2) 在内部方便的进行插入和删除操作
               (3) 可在两端进行push、pop
   缺点:(1) 
不能进行内部的随机访问,即不支持[ ]操作符和list.at()

               (2) 相对于verctor占用内存多

       需要大量的插入和删除,而不关心随即存取,则应使用list 


map:

map映照容器的元素数据是一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系(Key-Value)。
map映照容器的数据结构是采用红黑树来实现的,插入键值的元素不允许重复,比较函数只对元素的键值进行比较,元素的各项数据可通过键值检索出来

使用find()方法来搜索某个键值( map<intchar> :: iterator it = m.find(28) ;),如果搜索到了,则返回该键值所在的迭代器位置,否则,返回end()迭代器位置。由于map采用红黑树数据结构来实现,所以搜索速度是极快的。

for循环遍历删除满足条件的元素:

    for(map<K,T>::iterator it=dataMap.begin(); it!=dataMap.end();)

    {

        if(满足删除条件)

{

dataMap.erase(it++);

}

        else

        {

            it++;

        }

    }

使用map中的值时,虽然可以直接使用dataMap[key]取得相应的数据,但不建议使用,因为如果key不存在,并不会报错,引起任何异常,会直接创建出一个value(默认值初始化),并与key组成一对,存入dataMap中,相当于增加了一步dataMap[key]=defaultValue,然后再去取值。

因此,建议使用查找取值it->second,map<K,T>::iterator it = find(dataMap.begin(),dataMap.end(), findKey); 


0 0
原创粉丝点击