首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

处理stl容器的大小

对于STL容器(包括vector、list、deque、set、multiset、map、multimap、unordered_set、unordered_map等)的大小处理,有如下几个方面需要关注:

  1. 容器的内存分配

STL容器在内存中是以连续空间分配的方式实现的。当容器需要扩大时,它会在内存中分配一块更大的连续空间,并将元素复制到新容器的内存中。

  1. 容器的扩容

当容器中的元素数量超过容器的容量时,就需要对容器进行扩容。扩容过程就是将容器中的元素复制到新的更大的容器中,并释放旧容器的内存。

  1. 容器的内存分配策略

STL中的容器都是基于指针的,因此容器的内存分配策略也是基于指针的。在STL中,容器的内存分配策略有3种:

  • 在堆上分配内存:当容器在内存中分配一块更大的连续空间时,就会使用堆上分配内存的方式。这种方式会在内存堆中申请一块大小固定的内存,并在其周围预留一些空间,以便于后续的扩容操作。
  • 在栈上分配内存:当容器的容量不足以分配一块更大的连续空间时,就会使用栈上分配内存的方式。这种方式会在栈中申请一块大小固定的内存,并在其周围预留一些空间,以便于后续的扩容操作。
  • 在静态数组上分配内存:当容器的容量不足以分配一块更大的连续空间时,就会使用静态数组上分配内存的方式。这种方式会在静态数组中申请一块大小固定的内存,并在其周围预留一些空间,以便于后续的扩容操作。
  1. 容器的内存释放

当容器中的元素被删除或容器被销毁时,就会进行容器的内存释放。内存释放就是将容器中的元素释放掉,并将其占用的内存返回给操作系统。

以上就是STL容器的大小处理机制,它能够保证容器的内存分配和释放都是高效的,并且能够支持大规模容器的内存管理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • STL(标准模板库)

    STL提供了一组表示容器 迭代器 函数对象 和算法的模板。容器是一个与数组类似的单元,可以存储若干个值。STL容器是同质的,即存储的值的类型相同;算法是完成特定任务(如对数组进行排序 又或 在链表中查找特定值)的处方;迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针;函数对象是类似函数的对象,可以是类对象或函数指针。STL使得能够构造各种容器(数组 队列 链表等)和执行各种操作(包括搜索 排序和随机排列) STL并不是面向对象的编程,而是一种不同的编程模式-泛型编程,当然我们用一言两句可能说不清,我们可以通过一些实际应用真是了解到容器 迭代器 算法等

    02

    STL小结

    STL就是Standard Template Library,标准模板库。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list, vector,set,map等,STL也是算法和其它一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。是C++标准库的一个重要组成部分,它由Stepanov and Lee等人最先开发,它是与C++几乎同时开始开发的;一开始STL选择了Ada作为实现语言,但Ada有点不争气,最后他们选择了C++,C++中已经有了模板。STL又被添加进了C++库。1996年,惠普公司又免费公开了STL,为STL的推广做了很大的贡献。STL提供了类型安全、高效而易用特性的STL无疑是最值得C++程序员骄傲的部分。每一个C++程序员都应该好好学习STL。大体上包括container(容器)、algorithm(算法)和iterator(迭代器),容器和算法通过迭代器可以进行无缝连接。

    01

    Effective STL笔记

    #estl 第50条:熟悉与STL相关的web站点。三个:www.sgi.com/tech/stl、www.stlport.org 和 www.boost.org。 #estl 第49条:学会分析与STL相关的编译器诊断信息。嗯,第一招是替换大法,然后介绍了一下与容器、插入迭代器、绑定器、输出迭代器或算法相关的错误大概有什么套路看。 #estl 第48条:总是包含(#include)正确 的头文件。因为C++标准没有规定头文件的互相包含关系,所以不同的STL实现有所不同。要记住容器基本上声明在同名文件中,算法是algo..和 num..,迭代器在iterator中,函数子和配接器在functional中。 #estl 第47条:避免产生“直写型”(write-only)的代码。即所谓容易编写,但难以阅读和理解的代码,比如一行调用函数12次,其中 10 个是互不相同的。 #estl 第46条:考虑使用函数对象而不是函数作为STL算法的参数。嗯,因为函数对象更容易让编译器乐于内联,所以速度会快一些。从代码被编译器接受的程度而言,它们更加稳定可靠。 #estl 第45条:正确区分count、find、binary_search、lower_bound、upper_bound和equal_range。嗯,这与传入的区间是否已经排序有关,与你的目的有关,与容器有关,总之复杂,要自己去看这一小节两次。 googollee 我一直认为这个应该由重载来完成 RT @laiyonghao: #estl 第44条:容器的成员函数优先于同名的算法。原因:速度更快,且与容器结合得更加紧密,更能够与容器的行为保持一致。 #estl 第44条:容器的成员函数优先于同名的算法。原因:速度更快,且与容器结合得更加紧密,更能够与容器的行为保持一致。 #estl 第43条:算法调用优先于手写的循环。三个理由:效率更高,更不容易出错,和更好的可维护性。 #estl 第42条:确保less<T>与operator<T>具有相同的语义。真理总是如此平淡……还能说啥呢? #estl 第41条:理解ptr_fun、mem_fun和mem_fun_ref的来由。咳,想起当年理解 .* 和 ->* 的时候多么地头痛…… #estl 第40条:若一个类是函数子,则应使它可配接。因为 STL 的函数配接器要求一些特殊的类型定义,argument_type,result_type…之类。编写函数子从unary_function或 binary_function继承是一个不错的方案。 #estl 第39条:确保判别式是“纯函数”。纯函数即返回值仅仅依赖于其参数的函数。估计在这条阴沟里翻过船的人不少,哈哈哈。 #estl 第38条:遵循按值传递的原则来设计函数子类。换句话说就是让它们小巧,而且单态。这个条款的意义在于为赘重而且多态的函数子带来的问题提出一个解决方案,pimpl 惯用法。 #estl 第37条:使用accumulate或者for_each进行区间统计,前者的代码更明了一些,重要的是它们接受的函数子要求不同。 #estl 第36条:理解copy_if算法的正确实现。文中给出了一个正确实现,注意点是不能要求使用的函数子是可配接的,STL 算法都这样。 #estl 第35条:通过mismatch或lexicographical_compare实现简单的忽略大小写的字符串比较。 #estl 第34条:了解哪此算法要求使用排序的区间作为参数。嗯,STL 算法有不少是要排序的区间的,如果实参并非如此,轻则性能下降,重则逻辑错误,不可不察。 #estl 第33条:对包含指针的容器使用remove这一类算法时要特别小心。作为cpp程序员,一定要时刻警惕资源泄漏。boost::shared_ptr是一个好选择。 #estl 第32条:如果确实需要删除元素,则需要在remove这一类算法之后调用erase。嗯,讲的就是erase-remove惯用法的由来,另外在讲了一次不同容器删除元素的方法是不同的。 #estl 第31条:了解各种与排序有关的选择。简言之,介绍了partition/stable_partition/nth_element /partial_sort/sort/stable_sort的用法和适用场合。 吼吼,到这里,书就看了一半了。接下来是重头戏:算法。 #estl 第30条:确保目标区间足够大。特别是做覆盖的时候,一定要注意,可以先用resize撑大。插入时用back_inserter、front_…、 inserter和ostream_iterator。 #estl 第29条:对于逐个字符的输入请考虑使用istreambuf_iterator。先说了一下istream_it

    01

    C++ map 和 hashmap 区别

    1. stl map is an associative array where keys are stored in sorted order using balanced trees. while hash_map is a hashed associated container, where keys are not stored in an ordered way. key, value pair is stored using a hashed function.        2. insertion and lookup takes ologn time in map, also performance would degrade as the key size increases. mainly balance operations on large key ranges would kill performance. while lookup is very efficient o(1) in hash_map.        3. map is useful where you want to store keys in sorted order, hash_map is used where keys order is not important and lookup is very efficient.        4. one more difference is map has the important property that inserting a new element into a map does not invalidate iterators that point to existing elements. erasing an element from a map also does not invalidate any iterators. performance would mostly be o(lgn) due to the implementation of a balanced tree. for map custom objects you would need at the minimum the following operators to store data in a map "<" ">" "==" and of course the other stuff for deep copy.

    00
    领券