1 #include<iostream> 2 #include<algorithm> 3 #include<memory>//the hearder file of shared_ptr 4 #include <vector> 5 #include <list> 6 #include <map> 7 #include <string> 8 #include <set> 9 #include <utility> 10 11 using namespace std; 12 13 14 class StrVec { 15 public: 16 StrVec() ://allocator成员进行默认初始化 17 elements(0), first_free(0), cap(0) {} 18 StrVec(const StrVec&); 19 StrVec& operator=(const StrVec&); 20 ~StrVec(); 21 22 void push_back(const std::string&); 23 size_t size()const { return first_free - elements; } 24 size_t capacity()const { return cap - elements; } 25 std::string *begin()const { return elements; } 26 std::string *end()const { return first_free; } 27 private: 28 static std::allocator<std::string> alloc; 29 void chk_n_alloc() { 30 if (size() == capacity())reallocate(); 31 } 32 std::pair<std::string*, std::string*> alloc_n_copy(const std::string*, const std::string*); 33 void free(); 34 void reallocate(); 35 36 std::string *elements; 37 std::string *first_free; 38 std::string *cap; 39 }; 40 41 allocator<string> StrVec::alloc; 42 43 void StrVec::push_back(const string& s) { 44 chk_n_alloc();//检查是否有可用空间 45 alloc.construct(first_free++, s); 46 } 47 48 pair<string*, string*> StrVec::alloc_n_copy(const string*b, const string*e) { 49 string* newdata = alloc.allocate(e - b); 50 return make_pair(newdata, uninitialized_copy(b, e, newdata)); 51 } 52 53 void StrVec::free() {//销毁元素并且释放内存 54 if (elements) {//检查所要释放的内存非空 55 for (string* p = first_free;p != elements;/*空哦*/) 56 alloc.destroy(--p);//逆序销毁 57 alloc.deallocate(elements, cap - elements); 58 } 59 } 60 61 StrVec::StrVec(const StrVec& v) { 62 auto newdata = alloc_n_copy(v.begin(), v.end()); 63 elements = newdata.first; 64 cap = first_free = newdata.second; 65 } 66 67 StrVec& StrVec::operator=(const StrVec& v) { 68 auto newdata = alloc_n_copy(v.begin(), v.end()); 69 70 free(); 71 elements = newdata.first; 72 cap = first_free = newdata.second; 73 return *this; 74 } 75 76 StrVec::~StrVec() { free(); } 77 78 void StrVec::reallocate() { 79 auto newcapacity = size() ? size() * 2 : 1; 80 81 auto newdata = alloc.allocate(newcapacity); 82 auto dest = newdata; 83 auto ele = elements;//elements不可改变,下面size()和free()都将用到 84 85 for (size_t i = 0;i != size();i++) 86 alloc.construct(dest++, *ele++); 87 free(); 88 89 elements = newdata; 90 first_free = dest; 91 cap = elements + newcapacity; 92 } 93 94 int main(void) { 95 StrVec xi; 96 for (int i = 0;i < 10;i++)xi.push_back("xixi"); 97 for (const auto& mem : xi)cout << mem << " "; 98 99 cout << endl; 100 return 0; 101 }
静态成员alloc前面没加StrVec::导致报错,无法解析的外部命令,大概长这个样子:
想起来以前也碰到过,那时候没弄清楚,只是把成员函数的实现拉进类内了,受教(抱拳