您的位置:首页 > 其它

[Boolan] STL 花点功夫了解一下以前没去了解的东西^_^

2017-03-08 15:05 197 查看
一.vector

    (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);         真是神奇,据说在内存池会用到这种技术
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐