string类是C++自带的一个很重要的类。今天我想讲一些string类中常用的接口函数。使用string类时,必须包含头文件#include< string>
一、用于初始化的接口函数
注:size_t 等价于 unsigned int
函数声明形式 | 作用 |
---|---|
string() | 构造空的字符串对象,即构造空字符串 |
string(const string& str) | 拷贝构造 |
string(const char* s) | 用C格式字符串构造string对象 |
string(const string& str, size_t pos,size_ t lem=npos) | 从str中下标为pos的字符开始,拷贝len个字符到string对象中 |
string (const char* s, size_t n) | 将*s的前面n个字符拷贝到string对象中 |
string (size_t n, char c) | 将n个字符c拷贝到string对象中 |
用法举例:
int main()
{
string s1();
string s2("C++ is interesting");
string s4(s2, 3, 5);// is i
string s5(s4, 3, 100);//不会报错,自动打印至字符串结尾 is interesting
//如果把第三个参数换成string::npos,也会打印至字符串结尾
//string s6(s4,3,string::npos):
string s6("C++ is perfect", 3);//C++
string s7(5, 'x');//xxxxx
return 0;
}
二、string对象的三种遍历方式
(1)下标+[]
int main()
{
//.size()用来取string的长度
for (size_t i = 0; i < s2.size(); ++i)
{
//本质上是函数调用,因为在string类的内部已经重载了运算符[]
//s2.operator[](i) 返回第i+1个字符的引用
cout << s2[i] << " ";
}
cout << endl;
return 0;
}
由于string类中operator[]返回的是引用,因此既可以读也可以写
for (size_t i = 0; i < s2.size(); ++i)
{
s[i] = 'x';
}
(2)迭代器
迭代器比[]下标使用更为广泛 像string,vector等容器支持[]遍历,但是list,map等等容器不支持[]。我们试着用迭代器进行遍历:
int main()
{
string s1("C++ is interesting");
string::iterator it = s1.begin();//.begin()取到第一个数据的位置
while (it != s2.end()) //.end()取到最后一个数据的下一个位置
{
cout << *it << " ";
++it;
}
return 0;
}
如果s2是常量字符串,需要改成:
int main()
{
string s2("C++ is interesting");
string::const_iterator it = s2.begin();
while (it != s2.end())
{
cout << *it << " ";
++it;
}
return 0;
}
迭代器除了正向遍历外,还有反向迭代器以实现反向遍历:
int main()
{
string s3{ "C++ is interesting" };
string::reverse_iterator rit = s3.rbegin();
while (rit != s3.rend())
{
cout << *rit << " ";
++rit;//反向iterator依然是++,从尾往头加,不是--
}
return 0;
}
当然,也有针对常量字符串的反向迭代器。
const string s4{ "C++ is interesting" };
string::const_reverse_iterator rit = s4.rbegin();
总结一下,一共有四种迭代器:
- iterator
- const_iterator
- reverse_iterator
- const_reverse_iterator
(3)范围for
使用范围for遍历的特点是:一次取容器中的数据,赋值给e,自动判断结束
string s("C++ is interesting);
for (auto e : s3)
{
cout << e << " ";
}
三、实现string对象“增”的接口函数
声明形式 | 含义 |
---|---|
void push_back(char c) | 添加单个字符 |
string & append(const string & str) | 添加一个string对象 |
string& append(const char* s) | 添加一个字符串 |
string& append(const char* s, size_t n) | 添加字符串s的前n个字符 |
string& append(size_t n, char c) | 添加n个字符c |
string& operator+= (char c) | 添加字符c |
string& operator+= (const char* s) | 添加一个string对象 |
string& operator+= (const string& str) | 添加一个字符串 |
可以发现,实现“增”的功能有push_back,append,+=三种接口:
pus_back只能接单个字符
append接字符串
+=两者都可
用法举例:
int main()
{
string s1;
s1.push_back('C');
s1.push_back('+');
s1.push_back('+');
s1.append(" is");
s1 += ' ';
s1 += "interesting";
return 0;
}
四、实现string对象“删”的接口函数
string& erase(size_t pos = 0, size_t len = npos) | 从第pos+1个字符开始,删除len个字符 |
---|
npos的含义是unsigned int npos = -1,即整型最大值。因此使用时若不给len的值,默认将字符串后面全部删除
用法举例:
int main()
{
string s1 = "C++ is interesting";
s1.erase(0, 3);
cout << s1 << endl;
s1.erase(0);
cout << s1 << endl;
return 0;
}
五、实现string类对象“找”的接口
(1)查找单个字符
声明形式:
size_t find(char c, size_t pos = 0) const;
含义:从所给的pos位置开始(包括本身)一直到字符串结束,搜索c第一次出现的位置,返回其下标
(所以pos还可以表示该符号前面的字符个数)
使用举例:
int main()
{
//如果要求提取出文件名的后缀
string filename = "test.cpp";
size_t pos = filename.find('.');
if (pos != string::npos)
{
string suff(filename, pos, filename.size() - pos);//这是给string类对象赋初值的一种接口方式
cout << suff << endl;
}
return 0;
}
(2)查找一个字符串
声明形式:
size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
六、resize接口
string类中,有一个成员变量size,记录现有的字符个数。resize就是用来改变成员变量size的。
有两个重载形式:
void resize (size_t n);
void resize (size_t n, char c);
如果n小于string对象字符个数,则只保留前n个字符;
如果n大于字符个数,则在原字符串的后面追加字符c到20个(不是追加20个c)。如果没给c的值,默认全部添加’\0’
用法举例:
int main()
{
string s1 = "C++ is interesting";
s1.resize(3);
cout << s1 << endl;
s1.resize(10);
cout << s1 << endl;
return 0;
}