C++ - 类似"vector"容器(存储string) 的 实现
2013-11-10 10:55
447 查看
类似"vector"容器(存储string) 的 实现
本文地址: /article/1384309.html类似vector容器, 实现存储string类型, 需要预先分配内存, 然后根据添加元素的多少, 动态的增加内存(alloc_n_copy), 使用库函数"allocator<>"容器去管理内存.
新旧元素的赋值, 使用库函数move()去实现; 并且重写了copy构造器, copy-assignment构造器, destructor.
注意实现的每一个函数和"allocator<>"的使用; reallocate: 重新分配内存; free: 释放内存;
代码 (Eclipse CDT; GCC 4.7.1):
/* * CppPrimer.cpp * * Created on: 2013.11.7 * Author: Caroline */ #include <iostream> #include <memory> #include <vector> #include <string> #include <utility> #include <cstddef> class StrVec { public: StrVec () : elements (nullptr), first_free (nullptr), cap (nullptr) {} StrVec (const StrVec&); StrVec &operator= (const StrVec&); ~StrVec(); void push_back (const std::string &); size_t size () const { return first_free-elements; } size_t capacity () const { return cap-elements; } std::string *begin() const { return elements; } std::string *end() const { return first_free; } private: static std::allocator<std::string> alloc; void free(); void reallocate(); void chk_n_alloc () { if(size() == capacity()) reallocate(); } std::pair<std::string*, std::string*> alloc_n_copy (const std::string*, const std::string*); std::string *elements; std::string *first_free; std::string *cap; }; void StrVec::reallocate () { auto newcapacity = size() ? 2*size() : 1; //正常2倍, 为空分配一个 auto newdata = alloc.allocate(newcapacity); auto dest = newdata; auto elem = elements; for (std::size_t i=0; i!=size(); ++i) alloc.construct(dest++, std::move(*elem++)); //每个元素均移动 free(); elements = newdata; first_free = dest; cap = elements + newcapacity; } std::allocator<std::string> StrVec::alloc; //需要初始化 void StrVec::push_back(const std::string& s) { chk_n_alloc (); alloc.construct(first_free++, s); //注意后++ } std::pair<std::string*, std::string*> StrVec::alloc_n_copy(const std::string *b, const std::string *e) { auto data = alloc.allocate(e-b); //分配足够的空间 return {data, std::uninitialized_copy(b, e, data)}; //把数据存入空间, 返回首尾指针 } void StrVec::free () { if (elements) { for (auto p=first_free; p!=elements;) alloc.destroy(--p); //先--, 指向确定元素 alloc.deallocate(elements, cap-elements); //释放内存, 首元素和内存大小 } } StrVec::StrVec (const StrVec &s) { auto newdata = alloc_n_copy(s.begin(), s.end()); //pair类型 elements = newdata.first; first_free = cap = newdata.second; } StrVec::~StrVec() { free(); } StrVec &StrVec::operator= (const StrVec &rhs) { auto data = alloc_n_copy(rhs.begin(), rhs.end()); free (); elements = data.first; first_free = cap = data.second; return *this; } int main (void) { StrVec sv; sv.push_back("Girls"); sv.push_back("Ladies"); sv.push_back("Women"); for(auto it = sv.begin(); it != sv.end(); ++it) std::cout << *it << " "; std::cout << std::endl; return 0; }
本文出自 “永不言弃” 博客,请务必保留此出处http://spikeking.blog.51cto.com/5252771/1388025
相关文章推荐
- C++ - 类似"vector"容器(存储string) 的 实现
- C语言实现类似C++的容器vector
- c++中vector等容器的实现机制
- c++ primer(第五版)笔记 第十三章(4) string 类和 vector<string> 容器的简单实现
- C99 实现类似 C++ string.find
- 字符串分割split_string:用vector和string容器实现
- 用C++实现STL容器vector
- C++学习总结——顺序存储,链式存储,索引存储,哈希存储的优缺点,以及vector数组,list链表,十字链表,索引结构,hash表的实现
- 使用C++容器vector实现的两路归并排序
- 8.9 编写函数打开文件用于输入,将文件内容读入 string 类型的 vector 容器,每一行存储为该容器对象 的一个元素。8.10 重写上面的程序,把文件中的每个单词存储为 容器的一个元素
- Vector容器实现未知大小的数组动态存储数据
- C++学习笔记(字符串string、vector_deque、queue,multiset、map、multimap、容器拷贝问题)(复制粘贴,方便后面翻阅)
- 实现自己的C++ STL--vector容器
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
- 从零开始学C++之STL(三):迭代器类vector::iterator 和 vector::reverse_iterator 的实现、迭代器类型、常用的容器成员
- 用C++容器vector实现通讯录功能
- C++中动态内存分配"new" 和 容器"vector"有什么区别?
- 【C++】实现容器Vector
- C语言实现类似于C++的Vector容器