[CPP - STL] swap技巧】的更多相关文章

最近在看<Effective STL>,[条款17:使用“交换技巧”修整过剩容量]中提到容器的成函数void swap(container& from),即实现容器对象与from对象的交换. 另外,对于连续内存容器vector和string,还有shrink to fit(收缩到合适,根据容器的实际size设置capacity,减少实际内存分配)的功能. 以vector为例,首先说下,size和capacity.resize和reserve的含义及区别. 1. size和capacit…
假设我们预先为容器添加了一部分元素,接着用clear将它们删除,容器内部分配的存储空间实际上不会减小,改变的只是能够访问的元素个数.如下所示: std::vector<int> vec; for(int i=0;i<1000;i++) vec.push_back(i);vec.clear(); std::cout<<vec.capacity()<<std::endl; 此时控制台会输出1066,很明显之前的存储空间没有变化. 如果我们想要删除不必要的存储空间,可以…
最近在实现一个Delegate类的时候碰到了一个问题,就是copy and swap技巧和移动赋值操作符有冲突. 比如有以下一个类: class Fun { public: Fun(const Fun& rhs) throw(); Fun& operator=(Fun fun) { swap(fun); return *this; } void swap(Fun& other) throw(); }; 这个类实现了copy and swap技巧,在赋值的时候表现的很好.但是如果再加…
STL 即标准模板库(Standard Template Library),是 C++ 标准库的一部分,里面包含了一些模板化的通用的数据结构和算法.STL 基于模版的实现,因此能够支持自定义的数据结构. STL 中一共有 6 大组件: 容器 (container) 迭代器 (iterator) 算法 (algorithm) 分配器 (allocator) 仿函数 (functor) 容器适配器 (container adapter) 参考资料: [1] https://oi-wiki.org/l…
好久没写了,简单水一下吧! 一个是最近没怎么刷题,圣诞,元旦,leetcode暂停的比赛两周,自己最近沉迷于打游戏,没有好好抓住时间. 其实最近看了一点书,是侯捷的 <stl源码剖析>,有一个问题是:vector内存只会增长,不会释放,那么怎么释放vector的内存呢? 参考这个:http://blog.csdn.net/jerryjbiao/article/details/7389233 采用swap来进行释放,构造临时对象,调用成员函数,然后释放. 接着就有这个问题:stl的容器里面:只有…
STL的概念 源地址  https://www.ev0l.art/index.php/archives/15/ <li> Iterator (迭代器)<li> Container (容器) array<li> Alogrithm (算法)<li> Adapters (配接器) 用来实现容器之间的转接 面向过程-->面向对象->基于对象->泛型 代码 #include <iostream> #include <vector&…
1.考虑下面的需求,对于vec开始的时候有1000个元素,后来只有10个元素,那么vec的capacity至少还是1000,后面的990个内存单元,没有使用,但是还被vec霸占着.如何释放这些内存呢? 2.我们知道,vector进行copy构造的时候,根据rhs 的size进行分配内存.因此,我们可以建立一个临时对象,然后交换一下就可以了.如下: vector<int>(vec).swap(vec); vector<int>(vec) 是个临时对象,可认为capacity为10,而…
作为STL六大组件之一,在STL源代码及其应用中,很多地方使用了仿函数(functor),尤其在关联型容器(如set.map)以及algorithm(如find_if.count_if等)中.虽然已经接触functor很长时间了,但一直只是编写一些简单的functor,至于为什么要使用functor?functor在STL源代码如何定义?以及如何有效地使用functor呢?源码之前,了无秘密.终于狠下心来,研究了几天STL中的functor,其实functor是STL最简单的一个模块,也可以从此…
vector的clear成员函数可以清除vector中的元素,使其大小减至0.但它却不能减小vector占用的内存. [cpp] view plain copy int main() { vector<int> v(1U<<29); cout<<"step into stage one..."<<endl; sleep(30); v.clear(); cout<<"step into stage two...&quo…
第9条:慎重选择删除元素的方法 删除特定值元素,vector.string.deque用erase-remove:c.erase(remove(c.begin(),c.end(),1963),c.end()); list用c.remove();关联容器用c.erase(). vector.string.deque删除特定位置元素,用erase返回被删除元素下一位置的迭代器,因此用i=c.erase(i); 关联容器删除特定位置元素,则用c.erase(i++). 第14条:使用reserve避免…