目录
string(const string& str, size_t pos, size_t len = npos);
string(const char* s, size_t n);
string& operator = (const string& str);
string& operator = (const char* s);
string& append (const char* s);
tring& append (const string& str);
string& append (const string& str, size_t subpos, size_t sublen);
string& append (const char* s, size_t n);
string& append (size_t n, char c);
string& operator+= (const string& str);
string& operator+= (const char* s);
string& insert (size_t pos, const string& str);
string& insert (size_t pos, const char* s);
string& insert (size_t pos, size_t n, char c);
string& insert (size_t pos, const char* s, size_t n);
1.string有什么用
2. 标准库中的string类
string是一个动态增长的char字符数组。
更多详细看文档:
3. 构造
string();
- 空字符串构造函数(默认构造函数)
- 构造一个长度为零个字符的空字符串。
#include<iostream>
#include<string>
void test_string()
{
string str1;
}
(VS2019实现)
原始视图,就是用于看其内部结构是什么样的。
string(const char* s);
- 复制由s指向的以空结尾的字符序列(C字符串)。
#include<iostream>
#include<string>
void test_string()
{
string str2("hello world");
}
(VS2019实现)
string(const string& str);
- 拷贝构造
- 利用str拷贝构造
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str2("hello world");
string str3(str2);
}
(VS2019实现)
string(const string& str, size_t pos, size_t len = npos);
- 构造子字符串
- 复制从字符位置pos开始并跨越len个字符的str部分(如果str短则有多少拷多少或如果len( = string::npos(缺省))大于等于str长度,则复制到str的末尾)。
- npos意思是“直到字符串结束”。
-1转换为无符号数整数,即为最大的无符号整数(40亿多 -> 4G) 。所以因为size_t len的缺省值为最大的无符号整数,当不传参数时,是与传递长度大于str长度一样的。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str2("hello world");
string str4(str2, 6, 3);
}
(VS2019实现)
如果str短则有多少拷多少或如果len( = string::npos(缺省))大于等于str长度,则复制到str的末尾。
string(const char* s, size_t n);
- 从缓冲器
- 从s指向的字符数组中复制前n个字符。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str5("hello world", 7);
}
(VS2019实现)
string (size_t n, char c);
- 填充构造
- 用字符c的n个连续填充字符串。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str6("a", 10);
}
(VS2019实现)
3. 流重载
- 此函数重载运算符<<,使其行为与c++字符串的istream::operator>>中所述相同,但应用于string类型的对象。
使得输出更加便利:
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str1;
string str2("hello world");
cout << str1 << endl;
cout << str2 << endl;
}
(VS2019实现)
- 此函数重载运算符>>,使其行为与c字符串的istream::operator>>中所述相同,但应用于string类型的对象。
使得输入更加便利:
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str1;
string str2("hello world");
cin >> str1 >> str2;
}
4. 赋值重载
(赋值是直接进行覆盖)
string& operator = (const string& str);
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str1;
string str2("hello world");
str1 = str2;
}
(VS2019实现)
string& operator = (const char* s);
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str2("hello world");
str2 = "xx";
}
(VS2019实现)
string& operator = (char c);
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str2("hello world");
str2 = 'a';
}
(VS2019实现)
5. 元素访问 -> [ ]重载
使得对字符串的访问可以像数组一样。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str1("hello world");
cout << str1[0] << endl;
str1[0] = 'x';
cout << str1[0] << endl;
str1[0]++;
cout << str1[0] << endl;
//const
const string str2("hello world"); //只能访问不能修改
}
(VS2019实现)
对于自定义类型,是不能直接使用运算符的,所以在对运算符的调用上需要转换,使得运算符重载。
6. 迭代器
普通
迭代器是所有容器通用的访问方式。
迭代器在string中是一个指针一样的东西,是一个在string这个类里面的一个内嵌类型(里面dypedef的或其里面定义的内部类)。
正向迭代:
string::begin
- 返回指向字符串第一个字符的迭代器。
string::end
- 返回一个迭代器,该迭代器指向超过字符串的结束字符。
begin是第一个元素的位置,end是最后一个元素的下一个元素的位置。所以,其是一个左闭右开的区间。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str("hello");
string::iterator it = str.begin();
while (it != str.end())
{
cout << *it;
++it;
}
cout << endl;
}
补充:范围for
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str("hello");
string::iterator it = str.begin();
// 范围for -- 自动迭代,自动判断结束
// 依次取s中每个字符,赋值给ch
for (auto& ch : str)
{
ch++;
cout << ch;
}
}
范围for底层就是迭代器,当范围for执行时就会替换成之前的迭代器代码。
(VS2019实现)
反向迭代:
string::rbegin
- 返回反向迭代器以反向开始
string::rend
- 返回一个反向迭代器,该迭代器指向字符串第一个字符(被视为其反向端)前面的一个元素。
-rbegin是最后一个元素的位置,rend是的第一个元素上一个元素的位置。所以,其是一个左闭右开的区间。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str("hello");
string::reverse_iterator rit = str.rbegin();
while (rit != str.rend())
{
cout << *rit;
++rit;
}
cout << endl;
}
(VS2019实现)
const
例如,需要写一个输出函数,由于需要将const string&类型的形参进行接收。
正向迭代:
#include<iostream>
#include<string>
using namespace std;
void Print_string(const string& str)
{
string str("hello");
string::const_iterator it = str.begin();
while (it != str.end())
{
cout << *it;
++it;
}
cout << endl;
}
反向迭代:
#include<iostream>
#include<string>
using namespace std;
void Print_string(const string& str)
{
string::const_reverse_iterator rit = str.rbegin();
while (rit != str.rend())
{
cout << *rit;
++rit;
}
cout << endl;
}
对于cbegin,cend,crbegin,crend
此主要是c11针对于曾经的不规范,由于以前普通与const都是使用begin,end,rbegin,rend,所以为了规范出了cbegin,cend,crbegin,crend,(由于曾经的规范也不能更改,所以可以用也可以不用)。
7. 调节
向后追加一个(push_back)
string::push_back
- 将字符c追加到字符串的末尾,将其长度增加1。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str("Hello ");
str.push_back('-');
cout << str << endl;
}
(VS2019实现)
向后追加一个(重载+=)
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str("hello");
str += 'x';
cout << str << endl;
}
(VS2019实现)
向后追加一串或string(append)
string& append (const char* s);
- 追加由s指向的以空结尾的字符序列(C字符串)形成的字符串的副本。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str("Hello ");
str.append("world");
cout << str << endl;
}
(VS2019实现)
tring& append (const string& str);
- 追加str的副本。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str1;
string str2("hello world");
str1.append(str2);
cout << str1 << endl;
}
(VS2019实现)
string& append (const string& str, size_t subpos, size_t sublen);
- 追加str子字符串的副本。该子字符串是str中从字符位置子字符串开始并跨越子字符串字符的部分(或者,如果str短则有多少追加多少或如果长度大于等于str长度,则直到str结束)。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str1;
string str2("hello world");
str1.append(str2, 0, 20);
cout << str1 << endl;
}
(VS2019实现)
string& append (const char* s, size_t n);
- 在由s指向的字符数组中追加前n个字符的副本。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str("hello");
str.append("worldxxxxx", 5);
cout << str << endl;
}
(VS2019实现)
string& append (size_t n, char c);
- 追加字符c的n个连续副本。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str("hello");
str.append(10, 'x');
cout << str << endl;
}
(VS2019实现)
向后追加一串或string(重载+=)
string& operator+= (const string& str);
string& operator+= (const char* s);
- 通过在字符串的当前值末尾附加其他字符来扩展字符串。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
//string& operator+= (const string& str);
string str1("hello");
string str2("world");
str1 += str2;
cout << str1 << endl;
//string& operator+= (const char* s);
string str("hello");
str += "world";
cout << str << endl;
}
(VS2019实现)
8. 容量
string::size;
string::length
- 返回字符串的长度,以字节为单位。
string::max_size
string::capacity
- max_size:返回字符串可以达到的最大长度。
- capacity:返回当前为字符串分配的存储空间大小,以字节表示。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str("hello world");
cout << str.length() << endl;
cout << str.size() << endl;
cout << str.max_size() << endl;
cout << str.capacity() << endl;
}
(VS2019实现)
判断是否为空
string::empty
- 返回字符串是否为空(即其长度是否为0)。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str1;
string str2("hello world");
cout << str1.empty() << endl; //空返回1
cout << str2.empty() << endl; //有返回0
}
(VS2019实现)
扩容
string::reserve
- 请求对字符串容量进行调整,以适应最大长度为n个字符的计划大小变化。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str;
str.reserve(200); //开空间
cout << str.capacity() << endl;
cout << str.size() << endl;
}
(VS2019实现)
string::resize
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str;
str.resize(200); //开空间 + 初始化
cout << str.capacity() << endl;
cout << str.size() << endl;
}
(VS2019实现)
删除
string::clear
- 擦除字符串的内容,该字符串将变为空字符串(长度为0个字符)。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
string str("hello world");
str.clear();
}
(VS2019实现)
string::erase
- 删除部分字符串,减少其长度。
- 擦除字符串值中从字符位置pos开始并跨越len个字符的部分(如果str短则有多少删多少或如果len( = string::npos(缺省))大于等于str长度,则删除到字符串末尾)。
- Note:默认参数会删除字符串中的所有字符。
9. 修改
插入(insert)
string& insert (size_t pos, const string& str);
- 插入str的副本。
- 新内容插入到位置pos处的字符之前。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1("hello");
string s2("world");
s1.insert(0, s2);
return 0;
}
string& insert (size_t pos, const char* s);
- 插入由s指向的以空结尾的字符序列(C字符串)形成的字符串的副本。
- 新内容插入到位置pos处的字符之前。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s("hello");
s.insert(0, "xxx");
return 0;
}
string& insert (size_t pos, size_t n, char c);
- 插入字符c的n个连续副本。
- 新内容插入到位置pos处的字符之前。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s("hello");
s.insert(0, 10, 'x');
return 0;
}
string& insert (size_t pos, const char* s, size_t n);
- 在由s指向的字符数组中插入前n个字符的副本。
- 新内容插入到位置pos处的字符之前。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s("hello");
s.insert(0, "xxxxxxxxxxx", 2);
return 0;
}