memcpy
memset
strcpy
strcmp
strlen
- 自己动手实现一个
string
类
memcpy
、memset
实现
memcpy
实现
1 2 3 4 5 6 7 8 9 10 11 12 13
| void* memcpy(void* dst, const void* src, size_t n) { assert(dst != NULL); assert(src != NULL); void* ret = dst; while(n--) { *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = (char*)src + 1; } return ret; }
|
memset
实现
1 2 3 4 5 6 7 8 9
| void* memset(void* dst, int ch, size_t n) { assert(dst != NULL); void* ret = dst; while(n--) { *(char*)dst = (char)ch; dst = (char*)dst + 1; } return ret; }
|
strcpy
、strcmp
、strlen
实现
strcpy
实现
1 2 3 4 5 6 7 8 9
| char* strcpy(char* dst, const char* src) { assert(dst != NULL); assert(src != NULL); char* ret = dst; while((*dst++ = *src++) != '\0'); return ret; }
|
strcmp
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| int strcmp(const char* rhs, const char* lhs) { assert(rhs != NULL); assert(lhs != NULL); unsigned char c1, c2; while(1) { c1 = *rhs++; c2 = *lhs++; if(c1 != c2) { return c1 < c2 ? -1 : 1; } if(c1 == 0) { break; } } return 0; }
|
strlen
实现
1 2 3 4 5 6 7 8
| size_t strlen(const char* str) { if(str == NULL) { return 0; } const char* pc = str; while(*pc++ != '\0'); return pc - str - 1; }
|
关于标准库中的实现:通过减少数据从内存存取到寄存器的次数来提高效率,使用的手段是先字节对齐,然后每次读取一个4/8
字节的多字节数据,对多字节数据遍历是否存在\0
。
自己动手实现一个string
类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| #include <iostream> #include <utility> #include <cstring>
class String { private: char *_data; size_t _size; void init(const char *c_str) { _data = new char[_size + 1]; strcpy(_data, c_str); }
public: String() : _data(nullptr), _size(0) {}
String(const char *c_str) : _size(strlen(c_str)) { if(c_str) { init(c_str); } else { _data = nullptr; } }
String(const String &str) : _size(str._size) { if(str._data) { init(str._data); } else { _data = nullptr; } }
String(String &&str) noexcept : _data(str._data), _size(str._size) { str._data = nullptr; str._size = 0; }
~String() { if(_data) { delete _data; } }
String &operator=(const char *c_str) { String temp(c_str); swap(temp); return *this; }
String &operator=(const String &str) { return *this = str._data; }
String &operator=(String &&str) noexcept { if(this == &str) { return *this; } if(_data) { delete _data; } _data = nullptr; _size = 0; swap(str); return *this; }
size_t size() const { return _size; }
char *c_str() { return _data; }
const char *c_str() const { return _data; }
void swap(String &str) { using std::swap; swap(_data, str._data); swap(_size, str._size); }
bool operator==(const char *c_str) { if(strcmp(_data, c_str) == 0) { return true; } return false; }
bool operator==(const String &str) { return *this == str._data; }
char &operator[](size_t i) { return _data[i]; }
const char &operator[](size_t i) const { return _data[i]; } };
std::ostream &operator<<(std::ostream &os, const String str) { return os << str.c_str(); }
|