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

    xiaoxiao2021-03-25  131

    一.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);         真是神奇,据说在内存池会用到这种技术

    转载请注明原文地址: https://ju.6miu.com/read-2619.html

    最新回复(0)