[转]陈硕10分钟搞定string
来源:互联网 发布:如何做一个网络写手 编辑:程序博客网 时间:2024/04/30 10:50
#pragma once#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
- [转]陈硕10分钟搞定string
- 10分钟搞定cmake
- 10分钟搞定pandas
- MyEclipse汉化10分钟搞定
- 10分钟搞定工作周报
- 10分钟搞定.net正则表达式
- 10分钟搞定单向复制mysql
- 10分钟 搞定JS和OC交互
- 10分钟搞定kettle源码部署
- 10分钟搞定kettle源码部署
- 10分钟搞定pandas,分享共勉~
- 五分钟搞定Flex+PHP+MYSQL(转)
- 5分钟搞定内存字节对齐-转
- 转:5分钟搞定内存字节对齐
- 【转】5分钟搞定内存字节对齐
- 【转】5分钟搞定android混淆
- 五分钟搞定Maven
- 五分钟搞定WordPress
- proc_day03
- [Leetcode]Symmetric Tree
- Java中字符串对象和基本数据类型包装类
- hdoj Tree
- New与malloc的区别
- [转]陈硕10分钟搞定string
- (三)Unity5.0新特性------动画的StateMachineBehaviours
- HDU 4705 Y (树形DP + 计数)
- 软考复习计划
- C error 初始值设定项不是常量
- shell脚本
- arm_day01
- Xcode用SVN提交不了的问题
- ARP邻居模块