网站建设旅游,哪个网站做视频有钱,wordpress彩色标签云设置方法,微信网站开发企业文章目录 1. 前言2. 介绍3. string类的使用3.1 string类的构造函数3.2 string类对象的容量操作3.3 string类对象的访问及遍历操作3.4 string类对象的修改操作3.5 string类对象的字符串操作3.6 string类的非成员函数 4. string类的模拟实现 1. 前言 C语言中#xff0c;字符串是… 文章目录 1. 前言2. 介绍3. string类的使用3.1 string类的构造函数3.2 string类对象的容量操作3.3 string类对象的访问及遍历操作3.4 string类对象的修改操作3.5 string类对象的字符串操作3.6 string类的非成员函数 4. string类的模拟实现 1. 前言 C语言中字符串是以\0结尾的一些字符的集合为了操作方便C标准库中提供了一些str系列的库函数但是这些库函数与字符串是分离开的不太符合面向对象编程的思想而且底层空间需要用户自己管理稍不留神可能还会越界访问。所以C引入了string类作为标准库中用于处理字符串的数据类型。string类封装了字符串的操作提供了更方便、安全和高级的字符串处理功能更符合面向对象编程的思想。 2. 介绍 英文解释 简单来说 string是表示字符串的字符串类该类的接口与常规容器的接口基本相同再添加了一些专门用来操作string的常规操作。string在底层实际是basic_string模板类的别名typedef basic_stringchar, char_traits, allocatorstring;不能操作多字节或者变长字符的序列。 3. string类的使用
3.1 string类的构造函数
(constructor)函数代码功能说明string();默认构造函数构造一个空字符串长度为零个字符。string(const string str);拷贝构造函数构造一个 str 的副本。string (const string str, size_t pos, size_t len npos);子串构造函数拷贝 str 从字符位置 pos 开始跨越 len 个字符如果 str 太短或者 len 为string::npos则复制直到 str 的末尾。string(const char* s);拷贝由 s 指向的以空字符结尾的字符序列C 字符串。string (const char* s, size_t n);从由 s 指向的字符数组中拷贝前 n 个字符。string(size_t n, char c);使用字符 c 连续填充字符串 n 次。template class InputIterator string (InputIterator first, InputIterator last);拷贝迭代器区间[first, last)范围内的字符序列。
实例
// string constructor
#include iostream
#include stringint main()
{std::string s0(Initial string);// 按照上述描述的顺序使用的构造函数std::string s1;std::string s2(s0);std::string s3(s0, 8, 3);std::string s4(A character sequence);std::string s5(Another character sequence, 12);std::string s6a(10, x);std::string s6b(10, 42); // 42 is the ASCII code for *std::string s7(s0.begin(), s0.begin() 7);std::cout s1: s1 \ns2: s2 \ns3: s3;std::cout \ns4: s4 \ns5: s5 \ns6a: s6a;std::cout \ns6b: s6b \ns7: s7 \n;return 0;
}输出结果 3.2 string类对象的容量操作
函数名称代码功能说明sizesize_t size() const;返回字符串有效字符长度。lengthsize_t length() const;返回字符串有效字符长度。max_sizesize_t max_size() const;返回字符串可以达到的最大长度。resizevoid resize (size_t n); void resize (size_t n, char c);将字符串调整为长度为 n 的字符。如果 n 小于当前字符串的长度当前值将缩短为其前 n 个字符删除第 n 个字符之后的字符。如果 n 大于当前字符串的长度当前内容将被扩展插入足够数量的字符以达到大小为 n。如果指定了字符 c则新元素将被初始化为 c 的副本否则它们将是值初始化的字符空字符。capacitysize_t capacity() const;以字节为单位返回当前为字符串分配的存储空间的大小。reservevoid reserve (size_t n 0);请求将字符串的容量调整为计划更改的大小最多达到长度为 n 的字符。如果 n 大于当前字符串的容量该函数将导致容器增加其容量以容纳 n 个字符或更多。在所有其他情况下它被视为非强制性请求来缩小字符串的容量容器的实现可以自由优化并保留容量大于 n 的字符串。该函数不会对字符串长度产生影响也不能修改其内容。clearvoid clear();清空有效字符。emptybool empty() const;返回字符串是否为空即长度是否为 0。
3.3 string类对象的访问及遍历操作
函数名称代码功能说明operator[]char operator[] (size_t pos); const char operator[] (size_t pos) const;返回字符串中位置 pos 处字符的引用。atchar at (size_t pos); const char at (size_t pos) const;返回字符串中位置 pos 处字符的引用。该函数会自动检查 pos 是否是字符串中一个有效的字符位置即pos 是否小于字符串的长度如果不是则抛出 out_of_range 异常。backchar back();const char back() const;返回字符串的最后一个字符的引用。该函数不应在空字符串上调用。frontchar front();const char front() const;返回字符串的第一个字符的引用。
遍历操作
#include iostream
#include stringint main()
{std::string str(Test string);// 1.普通下标遍历for (size_t i 0; i str.size(); i)std::cout str[i];std::cout \n;// 2.迭代器遍历for (std::string::iterator it str.begin(); it ! str.end(); it)std::cout *it;std::cout \n;// 3.范围for遍历for (auto e : str)std::cout e;std::cout \n;return 0;
}解释 普通下标遍历 在这个部分的代码中使用了一个普通的for循环和下标操作符[]来遍历字符串中的字符。循环变量i从0开始递增直到达到字符串的长度通过str.size()获取。在每次迭代中使用str[i]来获取对应位置的字符并使用std::cout打印出来。迭代器遍历 这部分代码使用了迭代器来遍历字符串中的字符。通过调用str.begin()获取字符串的起始位置迭代器并使用str.end()获取字符串的结束位置迭代器。然后使用一个for循环和迭代器操作来遍历字符串中的每个字符。在每次迭代中使用解引用操作符*来获取当前迭代器指向的字符并使用std::cout打印出来。范围for遍历 在这部分代码中使用了范围for循环来遍历字符串中的字符。通过for (auto e : str)的语法将字符串中的每个字符依次赋值给变量e。在每次迭代中直接使用变量e来表示当前字符并使用std::cout打印出来。 3.4 string类对象的修改操作
函数名称代码功能说明operatorstring operator (const string str);string operator (const char* s);string operator (char c);在字符串末尾追加字符串 str、C字符串 s 或字符 c。appendstring append (const string str);在字符串后追加一个字符串 str。push_backvoid push_back (char c);在字符串后尾插字符 c。insertstring insert (size_t pos, const string str);在指定位置 pos 插入另一个字符串 str。erasestring erase (size_t pos 0, size_t len npos);从字符串的位置 pos 开始删除长度为 len 的字符如果内容太短或者 len 为 string::npos则直到字符串的末尾。如果未提供 len 参数则默认删除从位置 pos 开始到字符串末尾的所有字符类似于成员函数 clear。返回一个引用指向当前字符串的修改后的对象。
3.5 string类对象的字符串操作
函数名称代码功能说明c_strconst char* c_str() const;回一个指向以空字符结尾的字符序列即 C 字符串的指针该字符序列表示当前字符串对象的值。substrstring substr (size_t pos 0, size_t len npos) const;返回一个新构造的字符串对象其值为当前对象的子串副本。子串是从字符位置 pos 开始的、长度为 len 的字符序列或者直到字符串的末尾。findsize_t find (const string str, size_t pos 0) const;size_t find (const char* s, size_t pos 0) const;在当前字符串的 pos 索引位置默认为0开始查找子串 str或C 字符串 s返回找到的位置索引-1表示查找不到子串。rfindsize_t rfind (const string str, size_t pos npos) const;size_t rfind (const char* s, size_t pos npos) const;在当前字符串的 pos 索引位置开始反向查找子串 str或C 字符串 s返回找到的位置索引-1表示查找不到子串。find_first_ofsize_t find_first_of (const char* s, size_t pos 0) const;在当前字符串的 pos 索引位置默认为0开始在字符串中搜索与其参数中指定的任意字符匹配的第一个字符。find_last_ofsize_t find_last_of (const char* s, size_t pos npos) const;在当前字符串的 pos 索引位置默认为0开始在字符串中搜索与其参数中指定的任意字符匹配的最后一个字符。find_first_not_ofsize_t find_first_not_of (const char* s, size_t pos 0) const;在当前字符串的 pos 索引位置开始在字符串中搜索与其参数中指定的任意字符不匹配的第一个字符。find_last_not_ofsize_t find_last_not_of (const char* s, size_t pos npos) const;在当前字符串的 pos 索引位置开始在字符串中搜索与其参数中指定的任意字符不匹配的最后一个字符。
3.6 string类的非成员函数
函数名称代码功能说明operatorstring operator (const string lhs, const string rhs);返回一个新构造的字符串对象其值是将 lhs 的字符后跟 rhs 的字符连接而成。operatoristream operator (istream is, string str);支持 cin 读入 string 类对象遇到空格回车结束。operatorostream operator (ostream os, const string str);支持 cout 输出 string 类对象。getlineistream getline (istream is, string str);从输入流 is 中提取字符并将它们存储到字符串 str 中直到找到换行字符 ‘\n’。relational operatorsoperatoroperator!operatoroperatoroperatoroperator支持比较操作符!
说明 getline(cin, s)会获取前一个输入的换行符需要在前面添加读取换行符的语句。如getchar() 或 cin.get()。 例如 int n;
string s;
cin n;
getchar(); //cin.get()
getline(cin, s); // 可正确读入下一行的输入operator尽量少用因为传值返回导致深拷贝效率低。 4. string类的模拟实现
// string.h 文件
#pragma once
#include iostream
#include string.h
#include assert.h
using namespace std;namespace my_string
{class string{friend ostream operator(ostream _cout, const my_string::string s);friend istream operator(istream _cin, my_string::string s);public:typedef char* iterator;typedef const char* const_iterator;public:string(const char* str ):_size(strlen(str)), _capacity(_size){_str new char[_capacity 1];strcpy(_str, str);}void swap(string s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);}string(const string s):_size(0), _capacity(0), _str(nullptr){string tmp(s._str);swap(tmp);}string operator(const string s){if (this ! s){string tmp(s);swap(tmp);}return *this;}~string(){delete[] _str;_str nullptr;_size _capacity 0;}iterator begin(){return _str;}iterator end(){return _str _size;}const_iterator begin() const{return _str;}const_iterator end() const{return _str _size;}size_t size()const{return _size;}size_t capacity()const{return _capacity;}bool empty()const{return _size;}void reserve(size_t n){if (n _capacity){char* tmp new char[n 1];strcpy(tmp, _str);delete[] _str;_str tmp;_capacity n;}}void resize(size_t n, char c){if (n _size){_str[n] \0;_size n;}else{reserve(n);while (_size n){_str[_size] c;_size;}_str[_size] \0;}}void push_back(char c){if (_size _capacity){reserve(_capacity 0 ? 4 : 2 * _capacity);}_str[_size] c;_str[_size] \0;}string operator(char c){push_back(c);return *this;}void append(const char* str){size_t len strlen(str);if (len _size _capacity){reserve(len _size);}strcpy(_str _size, str);_size len;}string operator(const char* str){append(str);return *this;}string substr(size_t pos, size_t len){string s;size_t end pos len - 1;if (len npos || pos len _size){len _size - pos;end _size;}s.reserve(len);for (size_t i pos; i end; i){s _str[i];}return s;}void clear(){_str[0] \0;_size 0;}const char* c_str()const{return _str;}char operator[](size_t index){assert(index _size);return _str[index];}const char operator[](size_t index)const{assert(index _size);return _str[index];}bool operator(const string s){return strcmp(_str, s._str) 0;}bool operator(const string s){return strcmp(_str, s._str) 0;}bool operator(const string s){return *this s || *this s;}bool operator(const string s){return !(*this s);}bool operator(const string s){return !(*this s);}bool operator!(const string s){return !(*this s);}size_t find(char c, size_t pos) const{while (pos _size){if (_str[pos] c){return pos;}pos;}return npos;}size_t find(const char* s, size_t pos) const{const char* p strstr(_str pos, s);if (p)return p - _str;elsereturn npos;}string insert(size_t pos, char c){assert(pos _size);if (_size _capacity){reserve(_capacity 0 ? 4 : 2 * _capacity);}size_t end _size 1;while (end pos 1){_str[end] _str[end - 1];--end;}_str[pos] c;_size;return *this;}string insert(size_t pos, const char* str){assert(pos _size);size_t len strlen(str);if (len 0)return *this;if (len _size _capacity){reserve(len _size);}size_t end _size len;while (end pos len){_str[end] _str[end - len];--end;}strncpy(_str pos, str, len);_size len;return *this;}string erase(size_t pos, size_t len){assert(pos _size);if (len npos || pos len _size){_str[pos] \0;_size pos;}else{size_t begin pos len;while (begin _size){_str[begin - len] _str[begin];begin;}_size - len;}return *this;}private:char* _str;size_t _size;size_t _capacity;public:const static size_t npos;};ostream operator(ostream _cout, const my_string::string s){for (auto e : s)_cout e;return _cout;}istream operator(istream _cin, my_string::string s){s.clear();char buff[129];size_t i 0;char ch;ch _cin.get();while (ch ! ch ! \n){buff[i] ch;if (i 128){buff[i] \0;s buff;i 0;}ch _cin.get();}if (i ! 0){buff[i] \0;s buff;}return _cin;}
};const size_t my_string::string::npos -1;