stl迭代器

1.迭代器类型

·        Input iterators(输入) 提供对数据的只读访问。

·        Output iterators(输出) 提供对数据的只写访问。

·        Forward iterators(正向) 提供读写操作,并能向前推进迭代器。

·        Bidirectional iterators(全向) 提供读写操作,并能向前和向后操作。

·        Random access iterators(随机) 提供读写操作,并能在数据中随机移动。

2.几种不同的容器使用的迭代器类型


vector


随机访问


一种随机访问的数组类型,提供了对数组元素进行快速随机访问以及在序列尾部进行快速的插入和删除操作的功能。可以再需要的时候修改其自身的大小


deque


随机访问


一种随机访问的数组类型,提供了序列两端快速进行插入和删除操作的功能。可以再需要的时候修改其自身的大小


list


双向


一种不支持随机访问的数组类型,插入和删除所花费的时间是固定的,与位置无关。


set


双向


一种随机存取的容器,其关键字和数据元素是同一个值。所有元素都必须具有惟一值。


multiset


双向


一种随机存取的容器,其关键字和数据元素是同一个值。可以包含重复的元素。


map


双向


一种包含成对数值的容器,一个值是实际数据值,另一个是用来寻找数据的关键字。一个特定的关键字只能与一个元素关联。


multimap


双向


一种包含成对数值的容器,一个值是实际数据值,另一个是用来寻找数据的关键字。一个关键字可以与多个数据元素关联。

#1 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默认分配的大小时要进行整体的重新分配、拷贝与释
                     放

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

#3 deque
   双端队列 double-end queue
   deque是在功能上合并了vector和list。
   优点:(1) 随机访问方便,即支持[ ]操作符和vector.at()
               (2) 在内部方便的进行插入和删除操作
               (3) 可在两端进行push、pop
   缺点:(1) 占用内存多

#4 使用区别:
     1 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector 
     2 如果你需要大量的插入和删除,而不关心随即存取,则应使用list 
     3 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque

#迭代器失效情况

  1. vector 被删除元素的迭代器以及指向后面元素的迭代器全部失效。  

2. deque  在首部或尾部删除元素则只会使指向被删除元素的迭代器失效,  

    任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效。  

3. list 仅有指向被删除元素的迭代器失效。    

4. (mulit)map,(multi)set 仅有指向被删除元素的迭代器失效。

#map与hash_map比较

  1、STL的map底层是用红黑树实现的,查找时间复杂度是log(n);

  2、STL的hash_map底层是用hash表存储的,查询时间复杂度是O(1);

  3、什么时候用map,什么时候用hash_map?

    具体的应用,不一定常数级别的hash_map一定比log(n)级别的map要好,hash_map的hash函数以及解决地址冲突等都要耗时间,而且众所周知hash表是以空间换时间的,因而hash_map的内存消耗肯定要大,一般情况下,如果记录非常大,考虑hash_map,查找效率会高很多,如果要考虑内存消耗,则要谨慎使用hash_map。

#容器内存释放

  1. vector的clear成员函数可以清除vector中的元素,使其大小减至0。但它却不能减小vector占用的内存。

  2. 其他容器的clear成员都会释放其内存。

  3. 释放vector占用内存:vector<int> v(500); vector<int>().swap(v)。

时间: 2024-10-10 04:37:17

stl迭代器的相关文章

STL迭代器笔记

STL迭代器简介 标准模板库(The Standard Template Library, STL)定义了五种迭代器.下面的图表画出了这几种: input         output \            / forward     |    bidirectional     |        random access 要注意,上面这图表并不是表明它们之间的继承关系:而只是描述了迭代器的种类和接口.处于图表下层的迭代器都是相对于处于图表上层迭代器的扩张集.例如:forward迭代器不但

STL 迭代器 iterator const

STL迭代器很多时候可以当成指针来使用. 但是指针一般可以用const来控制访问. 那迭代器呢. #include <iostream> #include <vector> using namespace std; int main() { vector<int> vecs; vecs.push_back(1); vecs.push_back(3); vecs.push_back(2); //1. 表示改迭代器为const,不能修改.但是指向的值可以改变. 相当于int

高效STL—迭代器 &amp; 算法

每个标准STL容器提供了四种不容的迭代器:iterator.const_iterator.reverse_iterator和const_reverse_iterator.同时容器的insert和erase的某些形式只接受其中一种. 没有办法从const的迭代器转换为非const的迭代器,不能隐式转换也不能通过const_case转换.但是可以使用advance和distance来进行. Advance(I,distance(I,ci)); //i是一个一般的iterator,ci是一个const

C++: STL迭代器及迭代器失效问题

转载至:http://blog.csdn.net/wangshihui512/article/details/9791517 迭代器失效: 典型的迭代器失效. 首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器失效.那为什么迭代器会失效呢?vector元素在内存中是顺序存储,试想:如果当前容器中已经存在了10个元素,现在又要添加一个元素到容器中,但是内存中紧跟在这10个元素后面没有一个空闲空间,而vector的元素必须顺序存储一边索引访问,所以我们不能在内存中随便找个地方存储

stl迭代器失效

迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针.但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeof(vector::iterator)来查看,所占内存并不是4个字节.     首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器失效.那为什么迭代器会失效呢?vector元素在内存中是顺序存储,试想:如果当前容器中已经存在了10个元

STL迭代器辅助函数——advance

Advance(i, n) increments the iterator i by the distance n. If n > 0 it is equivalent to executing ++i n times, and if n < 0 it is equivalent to executing --i n times. If n == 0, the call has no effect. advance(i, n)使得迭代器i增加一个长度n.如果n>0,那么advance(i

C++ STL 迭代器方法 之 advance与prev 方法 浅析

[摘要] 迭代器是STL中重要的一支,prev和distance是其基本方法.distance方法十分简单,就不在此赘述,现主要对prev方法以及其相关方法--advance方法作简要介绍与使用说明,并在文末附上代码示例. [Advance 方法] Advance iterator Advances the iterator it by n element positions. If it is a random-access iterator, the function uses just o

STL迭代器失效总结

转自: http://blog.csdn.net/hackbuteer1/article/details/7734382             http://m.blog.csdn.net/blog/xhu_eternalcc/38355619 迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理 解成为一个指针.但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeof(

stl 迭代器失效

1.对于基于连续内存的容器,容器元素的增删,有可能会导致迭代器的失效.考虑: int main(int argc, char* argv[]) { vector<int> intVec; intVec.push_back(1); intVec.push_back(2); intVec.push_back(3); vector<int>::iterator iter1 = intVec.begin(); vector<int>::iterator iter2 = iter