温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++容器底层数据结构介绍

发布时间:2021-06-29 09:56:04 来源:亿速云 阅读:362 作者:chen 栏目:大数据

这篇文章主要介绍“C++容器底层数据结构介绍”,在日常操作中,相信很多人在C++容器底层数据结构介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++容器底层数据结构介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

内置数组:

int arr[10][10];
memset(arr,0,10*10*sizeof(int)); //初始化
int tmp[10][10];
memcpy(arr, tmp, 10 * 10 * sizeof(int));//拷贝

void *memcpy(void *destin, void *source, unsigned n); //源*目的内存覆盖问题

memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域);拷贝多少个?有一个size变量控制拷贝的字节数;

序列容器:array、vector 、deque、 list 、 forward_list

array<T,N> (数组容器) :基于数组,长度固定的序列,有 N 个 T 类型的对象。

vector<T> (向量容器)  :基于数组,长度可变的序列,用来存放T类型的对象,预留分配大一些的一段连续空间,当超出时会二次分配更大的拷贝过去。

deque<T> (双端队列容器) :长度可变序列,用来存放T类型的对象,在序列的两端都能高效地增加或删除元素,由一段一段的定量连续空间构成,下标访问必须进行二次指针解引用,与之相比 vector 的下标访问只进行一次,只保有一个元素的 deque 必须分配其整个内部数组(例如 64 位 libstdc++ 上为对象大小 8 倍; 64 位 libc++ 上为对象大小 16 倍或 4096 字节的较大者)。

list<T> (链表容器) :长度可变的、由 T 类型对象组成的序列,它以双向链表的形式组织元素,在这个序列的任何地方都可以高效地增加或删除元素。访问容器中任意元素的速度要比前三种容器慢,这是因为 list<T> 必须从第一个元素或最后一个元素开始访问,需要沿着链表移动,直到到达想要的元素。

forward list<T> (正向链表容器) :长度可变的、由 T 类型对象组成的序列,它以单链表的形式组织元素,是一类比链表容器快、更节省内存的容器,但是它内部的元素只能从第一个元素开始访问。

string:与vector相似的容器,但专门用于保存字符。随机访问快。在尾部插入/删除速度快。

所有序列容器的函数成员 max_size() 都会返回它能存储的元素个数的最大值。这通常是一个很大的值,一般是 2^32 -1。

C++容器底层数据结构介绍

Stack

The standard container classes vector, deque and list fulfill these requirements. By default, if no container class is specified for a particular stack class instantiation, the standard container deque is used. 

默认使用deque而不是vector作为底层容器

set、map、multimap、unordered_set、unordered_map、unordered_multimap的底层数据结构,以及几种map容器如何选择?

  • set、map、multimap基于红黑树,是非严格平衡二叉搜索树,元素有序,且插入、删除效率高但空间占用率高

  • unordered_set、unordered_map、unordered_multimap基于哈希表,元素无序,查找效率高。

  • 内存占有率的问题就转化成红黑树 VS hash表 , 还是unorder_map占用的内存要高,哈希表的建立比较耗费时间。

map<string,vector<int> > empty_map1; map1.swap(empty_map1); map1.clear(); 或 StrategyMap().swap(_stg_flows);

map.clear()只是把map清空了,但是内存没有释放,如果要释放内存不止是要clear()掉,还要和一个空的map来进行swap,将内存释放。

注意map中如果元素不是基本类型,也要进行内存释放,如指针,vector要尤其注意,否则map占的内存太大,会造成程序崩溃。

vector

C++容器底层数据结构介绍

array: 固定长度的数组,使用栈(静态内存分配),因此效率与数组相同。

  1. 使用fill方法实现了数据填充。

  2. 使用size方法取得数组的大小。

  3. 虽然at(i)方法实现带有越界检查的读写。

写入速度的比较结果:内置数组的速度最快,vector容器次之,array容器最慢???

拷贝速度:https://blog.csdn.net/qq_35976351/article/details/82940121

拷贝:/* 未开优化: array=466ms vector=7923ms memcpy=198ms */ /* -O3优化,最高速度: array=0ms vector=453ms memcpy=0ms */

迭代器iterator

在STL中,使用迭代器(内置类型 iterator)给出数据在表中的位置

  • 正向迭代器:containerType::iterator itr;

  • 常量正向迭代器(不可更改):containerType::const_iterator itr;

  • 反向迭代器:containerType::reverse_iterator itr;

  • 常量反向迭代器:containerType::const_reverse_iterator itr;

常用的需要使用迭代器的容器方法:

  • iterator insert(iterator pos, const Object & x):添加x到表中迭代器pos所指向的位置之前的位置。对1ist是常量时间操作,对vector则不是。返回值是一个指向插入项位置的迭代器

  • iterator erase(iterator pos):删除迭代器所给出位置的对象。对1ist是常量时间操作,对vector不是。返回值是调用之前pos所指向元素的下一个元素的位置。这个操作使pos失效。pos不再有用,因为它所指向的容器变量已经被删除了

  • iterator erase(iterator start, iterator end):删除所有的从位置start开始直到位置end(但是不包括end)的所有元素

到此,关于“C++容器底层数据结构介绍”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI