C++初阶(8) —— string类的部分接口函数讲解

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();

总结一下,一共有四种迭代器:

  1. iterator
  2. const_iterator
  3. reverse_iterator
  4. 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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值