您的位置:首页 > 编程语言 > C语言/C++

C++ 容器汇总(未完,待续)

2017-08-14 17:57 281 查看
1.    Vector

Vector实际是动态数组,在堆中分配,元素连续存放,如果插入新值大于当前分配大小时,会重新分配内存。

由于vector内存空间连续,所以在中间插入或删除会造成内存块的拷贝,因此不适用于经常对中间位置元素进行添加或删除的情景;最好在vector中保存结构或者类的指针,这样可以避免是移动是产生的构造与析构的开销;

2.    Map

Map是关联容器,以键值对的形式进行存储,以红黑树的结构实现,插入和删除等操作都是O(logn)。

(1)    使用说明

A.添加数据

map<int,string>maplive;
maplive.insert(pair<int,string>(102,"aclive")); 

maplive.insert(map<int,string>::value_type(321,"hai"));

maplive[112]="April";//map中最简单最常用的插入添加!

     B.查找数据

     Find()函数返回一个迭代器指向键值为key的元素,如果没有找到就返回指向map尾部的迭代器。

     map<int,string>::iterator I_it;

    I_it = maplive.find(112);

     If( maplive.end == I_it )//没有找到

     Else

      Cout<<I_it->first<<I_it->second;

    C.删除数据

     在删除数据时先查找要删除的数据是否存在,存在才删除。

     map<int,string>::iterator I_it;

    I_it = maplive.find(112);

 If ( maplive.end !=I_it)

 {

       maplive.erase(I_it);

}

D. map中sort问题

Map中的元素自动按key升序排序,因此不能对map使用sort函数

E. map中swap用法

Map中swap不是一个容器中的元素交换,而是两个容器交换

Map<int,int> M1,M2;

M1[1] = 10;

M1[2] = 20;

M1[3] = 30;

M2[1] = 10;

M2[2] = 50;

M1.swap(M2)

3.    Multimap

Multimap允许重复的键值插入容器。

4.    List

List本质是双向链表,能快速的进行插入和删除操作,但是随机访问比较慢。

(1)    正向与反向迭代器

反向迭代器允许从尾到头遍历list,该功能源于list本质是双向链表,存在向前的指针。

5.    Deque

Deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素。Deque被表示为一个分段数组,容器中的元素分段存放在一个个大小固定的数组中,此外deque还需要维护一个存放这些数组首地址的的索引数组,基于这点设计原理,deque可以实现随机访问,但是效率比vector低很多,具体结构图如下:

向两端添加数据时,如果这一端的分段数组未满,则可以直接加入,如果分段数组已满,需要创建新的分段数组,并把该分段数组的首地址加入到索引数组中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++