重写STL中的vector的内存配置器
Vector在创建时接受的参数
在c++STL中,容器类vector实际上在创建时可以接收两个参数,第一个是存储的元素的类型,第二个是内存配置器,第二个参数有默认值,但我们可以覆盖这个默认值,但是默认值的覆盖需要遵守一些规则,而这些规则则是本文的要讲述的。
创建时添加第二参数:std::vector<int, my::allocator<int>> iv; //创建一个元素类型为int,内存配置器为my空间下的allocator<int>类
简易内存配置器
#include <cstddef> #include <cstdlib> #include <climits> namespace my{ template<class T> class allocator{ public: //以下的 typedef 是必须的,因为在容器中有类似 _alloc::pointer 的语法 typedef T value_type; typedef T* pointer; typedef const T* const_pointer; typedef const T& const_reference; typedef T& reference; typedef size_t size_type; typedef ptrdiff_t difference_type; //rebind, 一般情况下似乎可以去掉,暂不知道在什么场景下使用 template <class U> struct rebind{ typedef allocator<U> other; }; //以下全部的方法都可无,而这取决于容器执行了什么操作 pointer allocate(size_type n, const void * hint = 0){ return (T*)malloc(n * sizeof(T)); //return (T*)(::operator new((size_t)(size * sizeof(T)))); } void deallocate(pointer p, size_type n){ delete(p); //free(p); } void construct(pointer p, const T& value){ new(p) T(value); } void destroy(pointer p){ p->~T(); } pointer address(reference x){ return (pointer)&x; } const_pointer const_address(const_reference x){ return (const_pointer)&x; } size_type max_size() const { return size_type(UINT_MAX/sizeof(T)); } }; } //简易测试 #include <iostream> #include <vector> using namespace std; int main(){ int a[5] = {1,2,3,4,5}; std::vector<int, my::allocator<int>> iv(a, a+5); iv.push_back(1); for(int i = 0; i < 6; ++i) std::cout << iv[i] << std::endl; }
内存配置器的接口
————————————————
版权声明:本文为CSDN博主「K946」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/A_littleK/article/details/102639016