ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

STL容器及简单使用总结

2020-03-16 22:44:56  阅读:210  来源: 互联网

标签:总结 容器 map STL 元素 插入 vector key


STL ( Standard Template Library) 的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL是C++的一部分,因此不用安装额外的库文件。

STL是一种泛型编程。面向对象编程关注的是编程的数据方面,而泛型编程关注的是算法。(不是很懂)

STL主要包括容器(containers)和算法(algorithms),以下是自己对几个主要的STL容器的理解。

STL容器

 

vector

向量,连续的空间存储,可以使用[]操作符。一个动态分配存储空间的容器,在插入新的元素后,会自动重分配(扩展)空间。

可以快速的在末尾插入元素,但是在序列中间的插入/删除元素要慢,而且如果一开始分配的空间不够的话,有一个重新分配更大空间,就会产生拷贝的性能开销。

list

双向链表,每个元素间用链表相连,可以非连续空间存储。不能使用[]操作符。

访问随机元素不如vector快,随机的插入元素比vector快,对每个元素分配空间,所以不存在空间不够,重新分配的情况。所以list更适合 需要在任意位置频繁插入/删除操作的情况。

queue

单向队列,也就是一个先进先出的FIFO,可以使用[]操作符。

deque

双向队列,可以使用[]操作符。

Queue是单向push,单向pop;而deque是双向(既可以从front方向,也可以从back方向) 都可以push和pop。

小片的连续,小片间用链表相连,实际上内部有一个map的指针。

快速的在开始和末尾插入元素;随机的插入/ 删除元素要慢;空间的重新分配要比vector快。

set

集合,关联容器,只有key值,元素唯一,不允许重复。

内部用一棵平衡树结构来存储,每次insert都会重新进行排序,查找也比较快

参考 《C ++ Primer》P378 关键字类型要求,默认情况下,标准库使用关键字类型的< 运算符来比较两个关键字。对于set 和map,是按照这个 < 关系来进行排序的。

我们不能直接定义一个 自定义类型的set或map,因为其没有 < 运算符,需要自己对自定义类型规定一个 < 运算符,以后有机会再专门讨论这个话题。

mutilset

元素允许重复

map

关联容器,一对一的映射的结合<key, value>,key不能重复。

可以通过insert(std::pair<key,value>)插入元素,或者直接 [key] =value进行插入。

可以直接使用[key]得到这个元素的value值。

对于set和map,要习惯使用迭代器iterator。

multimap

Key值可以重复

C语音中的数组也是连续存储,数组和vector的主要不同点在于vector可以随时增加长度,但数组的长度是在定义时就确定好了的。

Vector

数组

可以用size获取vector的长度

不可以获取,在定义时就已经确定了长度

长度不固定,可以随时增加

长度固定,在定义是就不可以更改

可以在末尾增加vector的元素(用push_back)

不能增加在长度以外的长度

不能确定长度,必须在定义时定义一个很大的空间留给数组,造成内存的浪费

可以确定长度,节约空间

可以用size获取vector的长度

不可以获取,在定义时就已经确定了长度

Vector、list、queue、deque都属于顺序容器,那怎么来选择用哪一种容器呢?

下面是选择顺序容器类型的一些准则

  1. 如果我们需要随机访问一个容器,则vector要比list好得多 。
  2. 如果我们已知要存储元素的个数,则vector 又是一个比list好的选择。
  3. 如果我们需要的不只是在容器两端插入和删除元素,则list显然要比vector好 。
  4. 除非我们需要在容器首部插入和删除元素,否则vector要比deque好。
  5. 如果只在容易的首部和尾部插入数据元素,则选择deque。

原文链接:https://blog.csdn.net/fx677588/article/details/52794015

 

各个STL容器的示例代码和函数用法都可以从网上直接找到,推荐这两个网址:

http://www.cplusplus.com/

https://en.cppreference.com/w/c

需要注意的是,在使用set和map时,因为key是唯一的,如果你insert了相同key值的元素,则会覆盖掉之前的元素(map的value值变成新插入的)。所以,为了避免不必要的debug工作,养成好的编码习惯:

  1. 在往set或map中插入新元素之前,先check是否已经有相同key的元素了,如果有,就assert。
    std::map<key type, value type>::iterator it = m_map.find( key_element );
    assert(it ==m_map.end());
    m_map[key_element] = value ;

     

  2. 在准备erase set或map中的元素时,先check是否存在这个key的元素。
    std::map<key type, value type>::iterator it = m_map.find( key_element );
    assert(it !=m_map.end());
    m_map.erase(it);

    同时,在使用STL容器的时候,一定要特别注意,有insert就需要有erase,否则内存会爆掉的。

标签:总结,容器,map,STL,元素,插入,vector,key
来源: https://blog.csdn.net/zgcjaxj/article/details/104909354

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有