一、默认成员函数
1、构造函数
(1)函数原型
string();
string (const string& str);
string (const string& str, size_t pos, size_t len = npos); //static const size_t npos = -1; 为很大的数
string (const char* s); //利用 char* s类型构造
string (const char* s, size_t n); //利用char * s,从一开始的位置到第n个位置,当n大于s的长度时,n就等于s的长度
string (size_t n, char c); //利用n个c进行构造
template <class InputIterator> //利用迭代器进行构造 左闭右开
string (InputIterator first, InputIterator last);
(2)演示:
//构造
void test01()
{
//无参
string s1();
//char *s
string s2("hehe");
cout << s2 << endl;
//拷贝
string s3(s2);
cout << s3 << endl;
//string 取一部分 // pos开始 ,size_s npos = -1
string s4(s2, 0, 3);
cout << s4 << endl;
//char *s 取一部分
string s5("hehe", 10);
cout << s5 << endl;
//用 n 个 char c初始化
string s6(10, 'c');
cout << s6 << endl;
//利用迭代器构造
string s7(s6.begin(), s6.end());
cout << s7 << endl;
}
2、析构函数:
这个函数我们不会用到。
3、赋值函数
(1)函数原型
//进行赋值
string& operator= (const string& str); //用一个同类型进行赋值
string& operator= (const char* s); //用一个字符串进行赋值
string& operator= (char c); //用一个字符进行赋值
(2)演示:
//赋值运算符重载
void test04()
{
string s1("hehe");
string s2;
string s3;
string s4;
s2 = s1;
s3 = "hehe";
s4 = 'c';
cout << s2 << endl;
cout << s3 << endl;
cout << s4 << endl;
}
二、常用遍历用到的接口
(1)函数原型
//迭代器
string::iterator being();//返回第一个位置的迭代器
string::iterator end();//返回结束位置下一个位置的迭代器
reverse_iterator rbeign();//返回结束位置的迭代器
reverse_iterator rend();//返回开始的前一个位置的迭代器
//at访问位置的值
char& at (size_t pos); //返回pos位置的值
const char& at (size_t pos) const; //返回const修饰的pos位置的位置的值
//重载 []
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
(2)演示:
//重载的[]
string s1("hehe");
for (int i = 0; i < s1.size(); i++)
{
cout << s1[i] << " ";
}
cout << endl;
//迭代器
string::iterator it = s1.begin();
while (it < s1.end())
{
cout << *it << " ";
it++;
}
cout << endl;
//at
for (int i = 0; i < s1.size(); i++)
{
cout << s1.at(i) << " ";
}
cout << endl;
三、常用连接、插入、修改、查找、删除常用的函数接口
1、连接
(1)函数原型:
//重载 +=
string& operator+= (const string& str); //在结尾处连接字符串str
string& operator+= (const char* s); //在结尾处连接字符串s
string& operator+= (char c); //在结尾处连接字符c
//append 在字符串结尾连接
string& append (const string& str); //在结尾处连接字符串str
string& append (const char* s); //在结尾处连接字符串s
//连接从迭代器first 到 last 这个区间到结尾 左闭右开
template <class InputIterator>
string& append (InputIterator first, InputIterator last);
(2)演示:
//连接
void test03()
{
string s1("hehe");
string s2("hehe");
//重载 +=
// +=s2
s1 += s2;
cout << s1 << endl;
// += char
s1 += 'a';
cout << s1 << endl;
// += char *
s1 += "hehe";
cout << s1 << endl;
string s3("hehe");
string s4("hehe");
// 连接 string
s3.append(s4);
cout << s3 << endl;
//连接 char*
s3.append("hehe");
cout << s3 << endl;
}
2、插入
(1)函数原型
//尾插一个字符
push_back(char c);
//insert 随机插入
//在pos位置插入一个字符串str
string& insert (size_t pos, const string& str);
//在pos位置插人字符串s
string& insert (size_t pos, const char* s);
//在迭代器插入c
iterator insert (iterator p, char c);
//在迭代器p插入从迭代器first到迭代器last这个区间 左闭右开
template <class InputIterator>
void insert (iterator p, InputIterator first, InputIterator last);
(2)演示:
//插入
void test06()
{
string s1("hehe");
string s2("hehe");
//尾插一个字符
s1.push_back('c');
cout << s1 << endl;
//在pos位置插入string
s1.insert(0,s2);
cout << s1 << endl;
//在pos位置插入char*
s1.insert(0, "hehe");
cout << s1 << endl;
}
3、修改
(1)函数原型
//assign 全部替换
//用字符串str替换原来的内容
string& assign (const string& str);
//用字符串s替换原来的内容
string& assign (const char* s);
//迭代器first到迭代器last这个区间替换原来的内容 左闭右开
template <class InputIterator>
string& assign (InputIterator first, InputIterator last);
//replace替换一部分
//将pos到len位置替换成str
string& replace (size_t pos, size_t len, const string& str);
//将迭代器i1到i2替换成str
string& replace (iterator i1, iterator i2, const string& str);
//将pos到len位置替换成s
string& replace (size_t pos, size_t len, const char* s);
//将迭代器i1到i2替换成s 左闭右开
string& replace (iterator i1, iterator i2, const char* s);
(2)演示:
//修改
void test05()
{
string s1("hehe");
string s2("he");
//连接stirng
s1.assign(s2);
cout << s1 << endl;
//连接char *
s1.assign("he");
cout << s1 << endl;
//迭代器
s1.assign(s2.begin(),s2.end());
cout << s1 << endl;
string s3("hehe");
//将pos到len位置替换string
s3.replace(0, 0, s2);
cout << s3 << endl;
//将pos到len位置替换char*
s3.replace(0, 0, "jeje");
cout << s3 << endl;
}
4、查找
(1)函数原型
//find从pos位置向后查找 找到返回下标位置,找不到返回npos
//查找字符串str
size_t find (const string& str, size_t pos = 0) const;
//查找字符串s
size_t find (const char* s, size_t pos = 0) const;
//查找字符c
size_t find (char c, size_t pos = 0) const;
//rfind 从pos位置向前找 找到返回下标位置,找不到返回npos
size_t rfind (const string& str, size_t pos = npos) const;
size_t rfind (const char* s, size_t pos = npos) const;
size_t rfind (char c, size_t pos = npos) const;
(2)演示:
//查找
void test07()
{
string s1("hehexuzhengyou");
string s2("xu");
//向后查找string
cout << s1.find(s2) << endl;
//先前查找string
cout << s1.rfind(s2);
}
5、删除
(1)函数原型
//清空
clear()
//尾删
pop_back();
//erase 删除
//删除从pos位置开始删除len个
string& erase (size_t pos = 0, size_t len = npos);
//删除迭代器p位置
iterator erase (iterator p);
//删除迭代器区间左闭右开
iterator erase (iterator first, iterator last);
(2)演示:
//删除
void test08()
{
string s1("hehe");
//删除一个
s1.erase(0, 1);
cout << s1 << endl;
//删除迭代器位置
s1.erase(s1.begin());
cout << s1 << endl;
//删除迭代器区间
s1.erase(s1.begin(), s1.end()-1);
cout << s1 << endl;
//清空
s1.clear();
}
四、其他一些常用接口
1、函数原型:
//字符串大小
size_t size() const;
//容量
size_t capacity() const;
//是否为空
bool empty() const;
//预留空间->一般用来扩容,不会影响大小
void reserve (size_t n = 0);
//重新指定大小,大于原来的长度就会扩容,短了就会截断,会影响容量
void resize (size_t n);
//长的部分用c来填充
void resize (size_t n, char c);
//返回c语言风格的字符串
const char* c_str() const;
//截一部分字符串,从pos位置开始截len个
string substr (size_t pos = 0, size_t len = npos) const;
//getline非成员函数
//输入一个string,直到遇到delim
istream& getline (istream& is, string& str, char delim);
//输入一个string,直到遇到 /n
istream& getline (istream& is, string& str);
2、演示:
//其他常用函数
void test09()
{
string s1("hehe");
cout << "size:" << s1.size() << endl;
cout << "capacity:" << s1.capacity() << endl;
if (s1.empty())
{
cout << "no" << endl;
}
else
{
cout << "ok" << endl;
}
s1.reserve(100);
cout << "capacity:" << s1.capacity() << endl;
s1.resize(10, 'c');
cout << "size:" << s1.size() << endl;
cout <<"类型:" << typeid(s1.c_str()).name() << endl;
cout << s1.substr(0, 4) << endl;
}