您好,登录后才能下订单哦!
这篇文章主要介绍“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<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。
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基于哈希表,元素无序,查找效率高。
内存占有率的问题就转化成红黑树 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占的内存太大,会造成程序崩溃。
array: 固定长度的数组,使用栈(静态内存分配),因此效率与数组相同。
使用fill方法实现了数据填充。
使用size方法取得数组的大小。
虽然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 */
在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++容器底层数据结构介绍”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。