[Boolan] STL 花点功夫了解一下以前没去了解的东西^_^
2017-03-08 15:05
197 查看
一.vector
(1).关于动态内存管理:http://www.kmonos.net/wlog/111.html#_2334100705
总结一下的话,理论上说是2倍 ,但其实对于任意的扩展倍数r
以上是内存重新分配情况下的拷贝次数,再加上没有重新分配内存时,添加新元素的次数:
stackoverflow的提问:http://stackoverflow.com/questions/1100311/what-is-the-ideal-growth-rate-for-a-dynamically-allocated-array
(2).迭代器返回的cbegin,cend,crbegin,crend
可以返回const_iterator:
二.operator new
今天第一次知道placement new这种操作的存在:
c++reference的定义:
throwing (1)
void* operator new (std::size_t size) throw (std::bad_alloc);
nothrow (2)
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw();
placement (3)
void* operator new (std::size_t size, void* ptr) throw();
前两个是一般所知的operator new 不过是一个抛bad alloc异常,一个不抛。第三个placement new貌似什么也没做,只是返回了ptr
inline void *__cdecl operator new(size_t, void *_P)
{return (_P); }
但是通过这个方法,可以在参数指针的地方重新分配空间,再调用构造函数,可以再ptr制定的地方构造对象
A* p = (A*)::operator new(sizeof(A));
new(p) A();
p->~A();
::operator delete(p); 真是神奇,据说在内存池会用到这种技术
(1).关于动态内存管理:http://www.kmonos.net/wlog/111.html#_2334100705
总结一下的话,理论上说是2倍 ,但其实对于任意的扩展倍数r
1 + r + r^2 + ... + r^logr(n) = (r^(logr(n)+1) - 1) / (r-1) // 等比数列求和 = (rn-1) / (r-1) // r^logr(n) = n ≒ r/(r-1) ・ n
以上是内存重新分配情况下的拷贝次数,再加上没有重新分配内存时,添加新元素的次数:
n-logr(n),除掉n次,平均每次的计算量约等于:2r-1/r-1 是常数级的。实际上r取多少并没有一个统一标准,1.5,2,1.2都有
stackoverflow的提问:http://stackoverflow.com/questions/1100311/what-is-the-ideal-growth-rate-for-a-dynamically-allocated-array
(2).迭代器返回的cbegin,cend,crbegin,crend
可以返回const_iterator:
std::vector<int> v = {1, 2, 3}; std::for_each(v.cbegin(), v.cend(), [](const int& x) { std::cout << x << std::endl; });(3).emplace()和emplace_back()
template <class... Args> iterator emplace(const_iterator position, Args&&... args);貌似和insert和push_back差不多,不过可以用args作为要插入对象的构造函数的参数,顺便容器的插入都是深拷贝(move,以后再说)
二.operator new
今天第一次知道placement new这种操作的存在:
c++reference的定义:
throwing (1)
void* operator new (std::size_t size) throw (std::bad_alloc);
nothrow (2)
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw();
placement (3)
void* operator new (std::size_t size, void* ptr) throw();
前两个是一般所知的operator new 不过是一个抛bad alloc异常,一个不抛。第三个placement new貌似什么也没做,只是返回了ptr
inline void *__cdecl operator new(size_t, void *_P)
{return (_P); }
但是通过这个方法,可以在参数指针的地方重新分配空间,再调用构造函数,可以再ptr制定的地方构造对象
A* p = (A*)::operator new(sizeof(A));
new(p) A();
p->~A();
::operator delete(p); 真是神奇,据说在内存池会用到这种技术
相关文章推荐
- 以前写的东西,转到这里纪念一下吧!
- 从AndroidStudio的启动参数开始,了解一下JVM的一些东西(内存使用,JIT等)
- 快换工作了,整理一下以前乱写的东西
- 今天给大家做一个猜数字游戏的东西,,不仅能帮助大家更加了解angluar还能小小娱乐一下
- Spring AOP详解 一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博
- 因为没工作了。所以的复习一下以前的东西。好去面试
- 想了解一下OA和ERP方面的东西
- STL经常被问到,具体是什么不了解,简单梳理一下
- 从AndroidStudio的启动参数开始,了解一下JVM的一些东西(内存使用,JIT等)
- 晚上要安装一下机顶盒,其实我也是要在网上详细了解一下过程
- windows 的发展历史(中)(了解一下,增加IT素养)
- Windows8中查看硬件系统的基本配置了解一下配置情况
- 和大家一起了解一下"深圳"
- 吃了辣的东西,感觉就要被辣死了,就往嘴里放上少许盐,含一下,吐掉,漱下口,就不辣了
- Github 最新 AI 开源项目了解一下?
- 关于计算机大概要了解的东西
- L2-020. 功夫传人(STL+深搜)
- 发现很多有趣的东西,需要整理一下了
- 从别处找到的有关web打印的东西,自己用了一下,还真不错,解决我的大问题了