c++之String类的尝试版本
来源:互联网 发布:linux获取线程优先级 编辑:程序博客网 时间:2024/06/05 05:12
#include <utility>#include <assert.h>#include <string.h>namespace trivial{// A trivial String class that designed for write-on-paper in an interviewclass String{ public: String() : data_(new char[1]) { *data_ = '\0'; } String(const char* str) : data_(new char[strlen(str) + 1]) { strcpy(data_, str); } String(const String& rhs) : data_(new char[rhs.size() + 1]) { strcpy(data_, rhs.c_str()); } /* Implement copy-ctor with delegating constructor in C++11 String(const String& rhs) : String(rhs.data_) { } */ ~String() noexcept { delete[] data_; } /* Traditional: String& operator=(const String& rhs) { String tmp(rhs); swap(tmp); return *this; } */ // In C++11, this is unifying assignment operator String& operator=(String rhs) // yes, pass-by-value { // http://en.wikibooks.org/wiki/More_C++_Idioms/Copy-and-swap swap(rhs); return *this; } // C++11 move-ctor String(String&& rhs) noexcept : data_(rhs.data_) { rhs.data_ = nullptr; } /* Not needed if we have pass-by-value operator=() above, * and it conflits. http://stackoverflow.com/questions/17961719/ String& operator=(String&& rhs) { swap(rhs); return *this; } */ // Accessors size_t size() const { return strlen(data_); } const char* c_str() const { return data_; } void swap(String& rhs) { std::swap(data_, rhs.data_); } private: char* data_;};}namespace trivial2{// string in C++11 with a length memberclass String{ public: String() noexcept : data_(nullptr), len_(0) { } ~String() { delete[] data_; } // only read str when len > 0 String(const char* str, size_t len) : data_(len > 0 ? new char[len+1] : nullptr), len_(len) { if (len_ > 0) { memcpy(data_, str, len_); data_[len_] = '\0'; } else { assert(data_ == nullptr); } } String(const char* str) : String(str, strlen(str)) { } String(const String& rhs) : String(rhs.data_, rhs.len_) { } String(String&& rhs) noexcept : data_(rhs.data_), len_(rhs.len_) { rhs.len_ = 0; rhs.data_ = nullptr; } String& operator=(String rhs) { swap(rhs); return *this; } void swap(String& rhs) noexcept { std::swap(len_, rhs.len_); std::swap(data_, rhs.data_); } // const char* data() const { return c_str(); } const char* c_str() const noexcept { return data_ ? data_ : kEmpty; } size_t size() const noexcept { return len_; } private: char* data_; size_t len_; static const char kEmpty[];};// const char String::kEmpty[] = "";}
0 0
- c++之String类的尝试版本
- SqlServer2005 尝试移植NET的String类
- C 语言版本的 string replace 函数
- C++STL之string类的使用
- 【C++】简单实现String类--深拷贝的普通版本和简洁版本
- 重新对c的尝试
- C宏的使用尝试
- MFC自定义消息 笔者的尝试版本
- 尝试linux下c编程之管道
- 尝试linux下c编程之Popen()
- PEAR之HTML_QuickForm的尝试
- 尝试的奇妙之处
- string类自己实现的版本
- C++STL之string的用法总结
- 《C++Primer》读书笔记之---Windows下通过命令行窗口编译运行C++程序的尝试
- C语言中面向对象的尝试
- C语言:泛型栈的一次尝试
- websocket 连接 C Server的尝试
- hdoj 5631 Rikka with Graph 【并查集】
- 数据结构----左偏树
- 大数的四则运算
- HDU 2639 Bone Collector II [动态规划 第k大01背包]
- 算法学习之KMP(模板整理)
- c++之String类的尝试版本
- hdu 5326(Work)
- 论文:Distilling the Knowledge in a Neural Network
- AngularJS 包含
- centos 安装 lnmp
- 改变从此刻开始
- PAT 1100. Mars Numbers (20)
- Cf 364div2 D[数学公式推导]
- 线段树总结