该vector只能容纳标准库中string类,
直接上代码了,StrVec.h文件内容为:
1 #ifndef STRVEC_H
2 #define STRVEC_H
3
4 #include<iostream>
5 #include<string>
6 #include<memory>
7 using namespace std;
8 class StrVec{
9 public:
10 // 默认构造函数
11 StrVec():elements(nullptr),first_free(nullptr),cap(nullptr)
12 {
13
14 }
15 //拷贝构造函数
16 StrVec(const StrVec& );
17 //拷贝赋值运算符
18 StrVec& operator=(const StrVec&);
19 ~StrVec();
20 void push_back(const string&);
21 size_t size() const { return first_free - elements ; }
22 size_t capacity() const { return cap - elements ;}
23 string* begin() const { return elements ;}
24 string* end() const { return first_free ;}
25
26
27
28 private:
29 static allocator<string> alloc; // 分配元素
30 // 被添加的元素的函数使用
31 void chk_n_alloc()
32 {
33 if( size() == capacity() )
34 reallocate();
35
37 }
38 // 工具函数,被拷贝构造函数、赋值运算符和析构函数所使用
39 pair<string* ,string*> alloc_n_copy(const string* ,const string* );
40
41
45 void free();
46 void reallocate();
47 string* elements; // 指向数组首元素的指针
48 string* first_free; // 指向数组第一个空闲元素的指针
49 string* cap; // 指向数组尾后的指针
50
51
52 };
53
59 #endif
StrVec.cpp文件内容为:
1 #include "StrVec.h"
2
3 std::allocator<string> StrVec::alloc;
4
5 void StrVec::push_back( const string& s )
6 {
7 chk_n_alloc(); // 确保有空间容纳新元素
8 // first_free指向的元素中构造s的副本
9 alloc.construct(first_free++,s) ;
10
11
12 }
13 pair<string* ,string* > StrVec::alloc_n_copy(const string* b, const string* e )
14 {
15 auto data = alloc.allocate(e-b);
16 return make_pair(data , uninitialized_copy(b,e,data) );
17
18
19 }
20 void StrVec::free()
21 {
22 // 不能传递给deallcoate一个空指针
23 if( elements)
24 {
25 for(auto p = first_free ; p != elements ; )
26 alloc.destroy(--p);
27 alloc.deallocate(elements,cap-elements) ;
28 }
29
30
31 }
32 StrVec& StrVec::operator=( const StrVec& rhs )
33 {
34 auto data = alloc_n_copy(rhs.begin() , rhs.end() );
35 free() ;
36 elements = data.first ;
37 first_free= cap=data.second;
38
39 return *this ;
40
41 }
42 void StrVec::reallocate()
43 {
44 // 我们将分配当前大小两倍的内存空间;
45 auto newcapacity = size() ? 2*size() :1 ;
46 //分配新内存
47 auto newdata = alloc.allocate( newcapacity ) ;
48
49 auto dest=newdata ;
50 auto elem = elements ;
51 for(size_t i=0; i != size() ; i++)
52 alloc.construct(dest++,std::move( *elem++) );
53 free();
54 elements = newdata;
55 first_free = dest ;
56 cap = elements+ newcapacity ;
57
58
59 }
60 StrVec::~StrVec()
61 {
62 free();
63 }
测试代码为maintest.cpp
1 #include "StrVec.h"
2
3 int main()
4 {
5 StrVec vec1;
6 vec1.push_back("ok1");
7 vec1.push_back("ok2");
8
9 auto begin = vec1.begin();
10 auto end= vec1.end();
11
12 while( begin != end )
13 {
14 cout<<*begin<<endl;
15 // cout<<endl;
16 begin++;
17
18 }
19
22 return 0;
23 }