C++ list, vector, map, set 区别与用法比较
2016-09-28 22:22
435 查看
基本理解:
list封装了链表 , vector封装了数组 , list和vector最大的区别在于vector使用了连续的内存存储的 ,支持[] ; list是以链表的形式实现的,地址不一定连续,不支持[]。
vector 对于随机访问的速度很快 ,但是头插元素很慢(因为要搬移数据) ,尾插数据较快(用下标通过[ ]访问);
list随机访问很慢(需要遍历链表),但是对于插入就很快了(不需要搬移数据,只需改变指针指向就可以了);
vector有容量大小,使用原生指针多为迭代器,list 没有容量,迭代器是另外创建的(因为需要重载++、--之类的运算符)
map/set 是关联式容器 ,底层使用红黑树,插入和删除的效率高(不需要内存拷贝和内存移动,直接改变节点的指针就好了)
set 和vector区别:set不包含重复的数据;
set和map区别: set只有key , map有key和对应的value
map 和hash_map 区别:hash_map使用了hash算法加快了查找的过程,但是需要更多的元素存放hash桶元素,可以理解为空间换时间。
vector
vector可以理解为动态数组(内存连续,容量可变)
STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacituy()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储,这给人以vector可以不指定vector即一个连续内存的大小的感觉。通常此默认的内存分配能完成大部分情况下的存储。
优点:1、不指定一个内存块的大小的连续存储,可以像数组一样操作,同时也可以对数组动态操作。push_back,pop_back
2、随机访问,支持[ ]
3、节省空间
缺点:1、插入删除效率太低
2、只能尾插push_back()和尾删pop_back()
3、当size 超过capacity时,要重新分配内存、拷贝原来数据、释放原来空间
list
双向链表
每个节点都包括一个信息块Info、一个前驱指针pre、一个后继指针Post 。使用非连续的内存空间进行存储。
优点:1、使用非连续空间完成动态操作
2、方便在插入和删除操作
3、可以在两端push和pop
缺点:1、不能随机访问,不支持[ ]
2、相对于vector占用内存较多( 两个指针占用内存)
deque
双端队列 ,vector和list在底层上使用deque
优点:1、随机访问,支持[ ]
2、插入删除方便
3、可以在两端push、pop
缺点:1、占用内存多(前后指针占用)
map
map映照容器的元素数据是一个key和value键值对
1、map创建、插入和遍历数据
创建map对象,key和value的类型由自己定义。在没有指定比较元素时,元素的插入位置是按key从小到大插入到红黑树中。
2、删除元素
map的erase()删除元素函数,可以删除某个迭代器位置上的元素,某个key的元素、一个迭代器区间的元素;
clear()清空map所有元素
3、元素的搜索
使用find()搜索某个key值,搜到了则返回迭代器的位置,否则返回end()位置
4、map默认是排序的----升序
举例:
set
set是集合,set中不会包含重复元素
在默认情况下会对元素进行自动排序 ,
set 默认是 升序的
在进行数据删除操作后,迭代器会不会失效呢?删除set的数据时,实际的操作是删除红黑树中的一个节点,然后相关指针做相关调整。指向其他元素的迭代器还是指向原位置,并没有改变,所以删除一个节点后其他迭代器不会失效。list和map也是同样的道理。然而删除vector中的某个元素,vector中其他迭代器会失效,因为vector是基于数组的,删除一个元素后,后面的元素会往前移动,所以指向后面元素的迭代器会失效。
list封装了链表 , vector封装了数组 , list和vector最大的区别在于vector使用了连续的内存存储的 ,支持[] ; list是以链表的形式实现的,地址不一定连续,不支持[]。
vector 对于随机访问的速度很快 ,但是头插元素很慢(因为要搬移数据) ,尾插数据较快(用下标通过[ ]访问);
list随机访问很慢(需要遍历链表),但是对于插入就很快了(不需要搬移数据,只需改变指针指向就可以了);
vector有容量大小,使用原生指针多为迭代器,list 没有容量,迭代器是另外创建的(因为需要重载++、--之类的运算符)
map/set 是关联式容器 ,底层使用红黑树,插入和删除的效率高(不需要内存拷贝和内存移动,直接改变节点的指针就好了)
set 和vector区别:set不包含重复的数据;
set和map区别: set只有key , map有key和对应的value
map 和hash_map 区别:hash_map使用了hash算法加快了查找的过程,但是需要更多的元素存放hash桶元素,可以理解为空间换时间。
vector
vector可以理解为动态数组(内存连续,容量可变)
STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacituy()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储,这给人以vector可以不指定vector即一个连续内存的大小的感觉。通常此默认的内存分配能完成大部分情况下的存储。
优点:1、不指定一个内存块的大小的连续存储,可以像数组一样操作,同时也可以对数组动态操作。push_back,pop_back
2、随机访问,支持[ ]
3、节省空间
缺点:1、插入删除效率太低
2、只能尾插push_back()和尾删pop_back()
3、当size 超过capacity时,要重新分配内存、拷贝原来数据、释放原来空间
list
双向链表
每个节点都包括一个信息块Info、一个前驱指针pre、一个后继指针Post 。使用非连续的内存空间进行存储。
优点:1、使用非连续空间完成动态操作
2、方便在插入和删除操作
3、可以在两端push和pop
缺点:1、不能随机访问,不支持[ ]
2、相对于vector占用内存较多( 两个指针占用内存)
deque
双端队列 ,vector和list在底层上使用deque
优点:1、随机访问,支持[ ]
2、插入删除方便
3、可以在两端push、pop
缺点:1、占用内存多(前后指针占用)
map
map映照容器的元素数据是一个key和value键值对
1、map创建、插入和遍历数据
创建map对象,key和value的类型由自己定义。在没有指定比较元素时,元素的插入位置是按key从小到大插入到红黑树中。
2、删除元素
map的erase()删除元素函数,可以删除某个迭代器位置上的元素,某个key的元素、一个迭代器区间的元素;
clear()清空map所有元素
3、元素的搜索
使用find()搜索某个key值,搜到了则返回迭代器的位置,否则返回end()位置
4、map默认是排序的----升序
举例:
#include <map> #include <string> #include <iostream> using std :: cout ; using std :: endl ; using std :: string ; using std :: map ; int main() { //定义map对象,当前没有任何元素</span> map<string,float> m ; //插入元素,按键值的由小到大放入黑白树中</span> m["Jack"] = 98.5 ; m["Bomi"] = 96.0 ; m["Kate"] = 97.5 ; m.erase("Jack"); //删除key为28的元素</span> //先前遍历元素</span> map<string,float> :: iterator it ; for(it = m.begin() ; it != m.end() ; it ++) { cout << (*it).first << " : " << (*it).second << endl ; } return 0 ; }
set
set是集合,set中不会包含重复元素
在默认情况下会对元素进行自动排序 ,
set 默认是 升序的
在进行数据删除操作后,迭代器会不会失效呢?删除set的数据时,实际的操作是删除红黑树中的一个节点,然后相关指针做相关调整。指向其他元素的迭代器还是指向原位置,并没有改变,所以删除一个节点后其他迭代器不会失效。list和map也是同样的道理。然而删除vector中的某个元素,vector中其他迭代器会失效,因为vector是基于数组的,删除一个元素后,后面的元素会往前移动,所以指向后面元素的迭代器会失效。
相关文章推荐
- c++ list, vector, map, set 区别与用法比较
- c++ list, vector, map, set 区别与用法比较
- c++ list, vector, map, set 区别与用法比较
- c++ list, vector, map, set 区别与用法比较
- c++ list, vector,deque, map,set 区别与用法比较
- c++ list, vector, map, set 区别与用法比较
- c++ list, vector, map, set 区别与用法比较
- c++ list, vector, map, set 区别与用法比较
- c++ list, vector, map, set 区别与用法比较
- c++ list, vector, map, set 区别与用法比较
- c++ list, vector, map, set 区别与用法比较
- C++ list, vector, map, set 区别与用法比较
- c++ list, vector, map, set 区别与用法比较
- c++中list, vector, map, set 区别与用法比较
- c++ list, vector, map, set 区别与用法比较
- c++ list, vector, map, set 区别与用法比较(2)
- c++ list, vector, map, set 区别与用法比较
- c++ list, vector, map, set 区别与用法比较
- c++ list, vector, map, set 区别与用法比较
- c++ list, vector, map, set 区别与用法比较