概述
????????你间歇性的努力和蒙混过日子,都是对之前努力的清零!
目录
一、string类重要成员函数
1.1 构造函数
1.2 类对象容量操作
1.3 string类对象的访问及遍历操作
1.4 string类对象的修改操作
1.4.1 c_str (返回C格式字符串)
1.4.2 operator+= (在字符串后追加字符串str)
1.4.3 npos
1.4.4 find+npos (从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置)
1.4.5 substr(在str中从pos位置开始,截取n个字符,然后将其返回)
1.5 string类非成员函数
1.5.1 operator<< 和 getline
1.5.2 relational operators (比较函数)
二、string类自我模拟实现主要成员函数
2.1 string类的基本框架
2.2 构造函数和析构函数
★2.3 “大佬”写的拷贝构造与赋值构造函数(深拷贝!)
2.3 类对象操作函数
2.3.1 size&&length(返回有效字符个数)
2.3.2 capacity(返回开辟空间大小)
2.3.3 empty(判断类字符数组有效字符是否为0)
2.3.4 clear(清理字符数组)
★★2.3.5 reserve (提前设定空间容量大小)
★★2.3.6 resize (修改有效字符个数)
2.4 string类对象的访问及遍历操作函数
2.4.1 operator[](获取字符数组指定位置字符)
2.4.2 begin/end(返回头/尾指针)
2.5 string类对象的修改操作函数
2.5.1 c_str(获取字符数组指针)
2.5.2 push_back(尾插)
★★2.5.3 operator+=(尾插入字符/字符串)
2.5.4 append(从某个字符串截取部分尾插到字符数组中)
2.5.5 insert(指定位置插入字符/字符串 ????需要挪动数据 注重临界!!)
2.5.6 erase(删除指定位置后面指定个数字符)
2.5.6 find (从指定位置向后寻找指定字符)
2.6 string类非成员函数
2.6.1 operator<<(申明为友元函数 !)
★★2.6.2 operator>>(申明为友元函数)
2.6.3 getline(可以获取输入的空格,也申明为友元)
三、总结
一、string类重要成员函数
1.1 构造函数
(constructor)函数名称 | 功能说明 |
string() (重点) | 构造空的string类对象,即空字符串 |
string(const char* s) (重点) | 用C-string来构造string类对象 |
string(size_t n, char c) | string类对象中包含n个字符c |
string(const string&s) (重点) | 拷贝构造函数 |
1.2 类对象容量操作
函数名称 | 功能说明 |
size(重点) | 返回字符串有效字符长度 |
length | 返回字符串有效字符长度 |
capacity | 返回空间总大小 |
empty (重点) | 检测字符串释放为空串,是返回true,否则返回false |
clear (重点) | 清空有效字符 |
reserve (重点) | 为字符串预留空间** |
resize (重点) | 将有效字符的个数该成n个,多出的空间用字符c填充 |
????resize
如果 n 小于当前字符串长度,则当前值将缩短为其第一个 n 个字符,删除第n个字符以外的字符。
如果 n 大于当前字符串长度,则通过在末尾插入所需数量的字符以达到n大小来扩展当前内容。如果指定了 c,则新元素初始化为c 的副本,否则,它们是值初始化字符(空字符)。????????这里提一下resize函数间接影响capacity三种情况(对n进行分类讨论):
1.n>原capacity 扩容
2.n=原capacity 不变
3.n<原capacity 不变
1.3 string类对象的访问及遍历操作
函数名称 | 功能说明 |
operator[] (重 点) | 返回pos位置的字符,const string类对象调用 |
begin+ end | begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭 代器 |
rbegin + rend | begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭 代器 |
范围for | C++11支持更简洁的范围for的新遍历方式(底层靠迭代器实现) |
int main()
{
string s("hello world!");
//1.运算符重载[]实现
for (int i = 0;i < s.size();i++)
{
cout << s[i];
}
cout << endl;
//2.迭代器
string::iterator it = s.begin();//获取头字符
while (it != s.end())
{
cout << *it;
it++;
}
cout << endl;
//3.范围for(底层依旧是迭代器)
for (auto ch : s)
{
cout << ch;
}
cout << endl;
//4.反向迭代器(从后往前)
string::reverse_iterator rit = s.rbegin();//取尾
while (rit != s.rend())
{
cout << *rit;
rit++;
}
cout << endl;
return 0;
}
1.4 string类对象的修改操作
函数名称 | 功能说明 |
push_back | 在字符串后尾插字符c |
append | 在字符串后追加一个字符串 |
operator+= (重点) | 在字符串后追加字符串str |
c_str(重点) | 返回C格式字符串 |
find + npos(重点) | 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置 |
rfind | 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置 |
substr | 在str中从pos位置开始,截取n个字符,然后将其返回 |
1.4.1 c_str (返回C格式字符串)
const char* c_str() const
1.4.2 operator+= (在字符串后追加字符串str)
string (1) string& operator+= (const string& str);c-string (2) string& operator+= (const char* s);character (3) string& operator+= (char c);
1.4.3 npos
(size_t npos=-1 表示无符号整型) 是类的静态私有成员,是整形能够表示的最大值
1.4.4 find+npos (从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置)
返回值:第一个匹配项的第一个字符的位置,如果未找到匹配项,则该函数返回string::npos
string (1) size_t find (const string& str, size_t pos = 0) const;c-string (2) size_t find (const char* s, size_t pos = 0) const;buffer (3) size_t find (const char* s, size_t pos, size_t n) const;character (4) size_t find (char c, size_t pos = 0) const;
1.4.5 substr(在str中从pos位置开始,截取n个字符,然后将其返回)
申明:string substr (size_t pos = 0, size_t len = npos) const ;
1.5 string类非成员函数
函数 | 功能说明 |
operator+ | 尽量少用,因为传值返回,导致深拷贝效率低 |
operator>> (重点) | 输入运算符重载 |
operator<< (重点) | 输出运算符重载 |
getline (重点) | 获取一行字符串 |
relational operators (重点) | 大小比较 |
1.5.1 operator<< 和 getline
???????? cin读取不了空格,空格表示分隔
比如你输入hello world! 输出只有hello
那么如何获取空格呢? getline()函数可以
(1) istream& getline (istream& is, string& str, char delim);(2) istream& getline (istream& is, string& str);
//要包头文件 #include<string> int main () { std::string name; std::cout << "Please, enter your full name: "; std::getline (std::cin,name); std::cout << "Hello, " << name << "!n"; return 0; }
1.5.2 relational operators (比较函数)
(1)
bool operator== (const string& lhs, const string& rhs); bool operator== (const char* lhs, const string& rhs); bool operator== (const string& lhs, const char* rhs);(2) bool operator!= (const string& lhs, const string& rhs); bool operator!= (const char* lhs, const string& rhs); bool operator!= (const string& lhs, const char* rhs);(3) bool operator< (const string& lhs, const string& rhs); bool operator< (const char* lhs, const string& rhs); bool operator< (const string& lhs, const char* rhs);(4) bool operator<= (const string& lhs, const string& rhs); bool operator<= (const char* lhs, const string& rhs); bool operator<= (const string& lhs, const char* rhs);(5) bool operator> (const string& lhs, const string& rhs); bool operator> (const char* lhs, const string& rhs); bool operator> (const string& lhs, const char* rhs);(6) bool operator>= (const string& lhs, const string& rhs); bool operator>= (const char* lhs, const string& rhs); bool operator>= (const string& lhs, const char* rhs);
二、string类自我模拟实现主要成员函数
2.1 string类的基本框架
????为了与std::string不冲突,我们自己开了一个命名空间,在命名空间内调用自己写的string!
//基本框架
namespace wyz
{
class string
{
public:
private:
char* _str;//指向char 数组的指针
size_t _capacity;//数组容量
size_t _size;//有效字符个数
const static size_t npos = -1;
};
}
2.2 构造函数和析构函数
string(const char* str)
{
_capacity = strlen(str);
//!注意要多开一个空间给'