c++模板类string成员函数

c++在c语言的基础上扩展了对于字符串的支持,使其使用方式更加多样化,使用者可以根据实际需要选择最佳的使用方式,具有更强的可操作性。
c++继承了c语言中的c风格字符串,并开发出了内置的string类。c语言标准函数库中提供了大量的函数用来操作以’\0’结尾的字符串,比如strcpy、strlen、strcmp、strcat等。c++继续支持这些函数,并且在string类中提供了功能与之一样的成员函数,另外还增加了一些其他的功能。

一.string类构造函数
string类提供了多个构造函数,可以根据需要灵活地使用这些函数创建string对象。

  1. string();
    默认构造函数。创建一个默认的string对象,长度为0。
    比如:string str; 使用这样的方式来创建string对象时会调用。
    只是声明但没有初始化,编译器会将默认值赋给 s1,默认值是””,即空字符串。
  2. string(const char* s);
    将string对象初始化为s指向的字符串。
    比如:string str = “abcdef”; 将str初始化为字符串 ”abcdef” 。
    与c风格字符串不同,以此方法创建的字符串的结尾没有字符串结束符 ’\0’ 。
  3. string(size_type n, char c);
    创建一个包含n个元素的string对象,其中每个元素都被初始化为字符c。
    比如:string str = (4, ‘A’); 将str初始化为字符串 “AAAA”。
  4. string(const string & str);
    拷贝构造函数。将一个string对象初始化为string对象str(复制构造)。
    比如:string a(“abcd”); //将a初始化为字符串”abcd”
    string b(a); //将b初始化为和a一样,即b也是字符串”abcd”
  5. string(const char *s, size_type n);
    将string对象初始化为s指向的字符串的前n个字符。
    比如:string a(5, ‘X’); //将a初始化为字符串”XXXXX”
    string b(a, 3); //将b初始化为字符串a的前3个字符,即”XXX”
    使用该方法具有一定的风险性,如果n超过了s指向的字符串的长度,会导致一些无用的字符也被赋给该string对象。读者不妨将string b(a, 3)改为string b(a, 2000); 进行对比。
  6. string(const string &str, string size_type pos=0, size_type n=npos);
    将string对象初始化为参数str指向的字符串中的一连串字符。这一连串字符是从下标为pos的字符开始的n个字符。如果从下标为pos的字符开始算起,str指向的字符串没有n个字符,那么就会使用该字符串从下标为pos的字符到结尾的所有字符将string对象初始化。
    比如:string a(“abcdef”); //将a初始化为字符串”abcdef”
    string b(a, 2, 3); //将b初始化为字符串”cde”
    string c(a, 2, 10); //长度溢出,只会将c初始化为”cdef”
    cout<<”a[0] = ”<<a[0]<<endl; //a[0] = a
    cout<<”c[3] = ”<<c[3]<<endl; //c[3] = f
    string对象可以像使用字符数组一样通过下标访问到每一个元素(即字符),下标同样是从0开始,但是string对象最后面没有字符串结束符 ’\0’ 。
  7. tempaltestring(Iter begin, Iter end);
    和第6点的用法相似,也是使用另一个字符串中的一连串字符来初始化string对象。区别是Iter begin和Iter end分别指定了这一连串字符的起始地址和结束地址,但是只包括Iter begin,不包括Iter end。
    比如:string a(“abcdef”); //将a初始化为字符串”abcdef”
    string b(a+1, a+5); //错误,a是一个string类对象,不是指针,a+1没有意义
    string c(&(a[1]), &a[5]); //将c初始化为字符串 ’bcde’,而不是’bcdef’
    或者这样:const char* a = “abcedf”; //此时a是一个指针,表示的是地址,对它进行 + 操作是合理的。
    string b(a+1, a+5); //将b初始化为字符串 ’bcde’ 。

二.string对象的赋值

  1. 直接赋值
    可以使用char*类型的常量、变量,char类型的常量、变量对string对象进行赋值
#include<iostream>
#include<string>
using namespace std;
int main()
{
	char a[10] = "2";
	char* a1 = a;
	string str = a1;     //char*型变量对string对象赋值
	cout << "str = " << str << "  str.size() = " << str.size() << endl;
	
	const char* a2 = "abcd";
	str = a2;            //char*型常量对string对象赋值
	cout << "str = " << str << "  str.size() = " << str.size() << endl;

	char b1 = 'A';
	str = b1;            //char型变量对string变量赋值
	cout << "str = " << str << "  str.size() = " << str.size() << endl;

	const char b2 = 'B'; //char型常量对string变量赋值
	cout << "str = " << str << "  str.size() = " << str.size() << endl;
}

编译运行结果:
在这里插入图片描述
2. 调用成员函数assign() 赋值
string 类提供了assign成员函数,可以用来对string 对象赋值。assign 成员函数返回对象自身的引用。assign()的用法与string类的构造函数相同。例如:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str("abcdef"),str1;
	str1.assign(str);
	str1.assign("aaaa");
	str1.assign(str, 2);
	str1.assign(5, 'A');
	str1.assign(str, 2, 5);
	cout << "str1 = " << str1 << "  str.size() = " << str1.size() << endl;
}

编译运行结果:
在这里插入图片描述
三.将string对象转换为c风格字符串
string类提供了一个成员函数 c_str() ,该函数使我们能够将string类型的字符串转换为c风格字符串,并返回指向该字符串的const指针(const char*)。
对于有些只能对const char*类型进行操作的函数来说,c_str() 提供了极大的方便。

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str = "c风格字符串123";
	cout<<"strlen of a = "<<strlen(a.c_str())<<endl;  //等于14
}

四.计算string类型的字符串长度
在上面第三点中,我们使用strlen()函数计算字符串str长度时,需要先将string类型的str转换成const char* 类型,因为strlen()函数接受一个const char* 类型的参数。
string类提供了两个成员函数 size()和length() 。这两个函数的源码除了名称差异没有任何不同。length()函数是在string类开发出来的时候就有的,后来c++引入了标准模板库STL,又加入了size();size()是作为容器的属性存在,便于符合STL的接口规则。

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str = "c风格字符串123";
	cout<<"str.size() = "<<str.size()<<endl;
	cout<<"str.length() = "<<str.length()<<endl;
	cout<<"strlen() of str = "<<strlen(str.c_str())<<endl;  
}

编译运行结果:
在这里插入图片描述
五.string对象的比较
与c风格字符串一样,string类的对象之间也可以进行比较,并且比较方式也和c风格字符串一样,即从第一个字符开始,比较其ASCII码值,如果相等则继续比较下一个字符,直至最后一个字符。
string类除了使用 <、<=、==、!=、>=、> 这些运算符比较之外,还提供了成员函数compare()用于比较字符串大小。该函数返回一个整数来表示比较的结果,如果两个字符串相等,返回0;如果调用方法的string对象大于作为参数传进来的对象,返回1;否则返回 -1。
compare()有多个重载,可用于不同的需求。如下:

  1. int compare (const basic_string& s) const;
  2. int compare (const Ch* p) const;
  3. int compare (size_type pos, size_type n, const basic_string& s) const;
  4. int compare (size_type pos, size_type n, const basic_string& s,size_type pos2, size_type n2) const;
  5. int compare (size_type pos, size_type n, const Ch* p, size_type = npos) const;
    其中最常用的是第一种:
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str = "c风格字符串123";
	string str1 = "c风格字符串122";
	if ( str >= str1 )  //运算符比较两个string对象
	{
		if( str.compare(str1)>0 )  //compare()函数比较两个string对象
		{
			cout << "hi!" << endl;
			cout << str.compare("c风格字符串124") << endl; //compare()函数重载比较string对象和c风格字符串大小
		}
		cout << "hi!" << endl;
	}

编译运行结果:
在这里插入图片描述
六.string对象的拼接
在c语言中,我们使用strcat()函数来进行字符串的拼接,或者使用strcpy()、memcpy()、memccpy()等函数进行字符串或者字符数组的拼接。
有了string类,我们可以直接使用 + 或者 += 运算符来拼接字符串。使用 + 来拼接字符串时,运算符的两边可以都是 string类型的字符串,也可以是一个 string类型字符串和一个c风格的字符串,还可以是一个string类型字符串和一个字符数组,或者是一个string类型字符串和一个单独的字符。例如:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str = "123";
	string str1 = "abc";
	char a[4] = "ABC";
	char b = 'D';
	string total = str + str1 + a + b;
	cout << total << endl;	
}

编译运行结果:
在这里插入图片描述
此外,string类还提供了一个成员函数append()。该函数可以用来向某个string对象后面添加字符串,并返回对象自身的引用。
append()也有多个重载,其用法与构造函数string()和赋值函数assign()相同。例如:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str = "123";
	string total;
	total.append(str,0,3);
	total.append("abc",0,3);
	total.append("ABC");
	total.append(1, '$');
	cout << total << endl;
}

编译运行结果和上面使用 + 运算符拼接完全一样,也是 123abcABC$ 。

七.插入字符串
string类提供了一个insert() 成员函数,可以向一个string类型的字符串中插入另一个字符串,并返回对象自身的引用。
在c语言的字符串操作函数中,并不存在向一个字符串插入另一字符串的函数,前面提到的memcpy()、strcpy()等函数虽然可以从某一个字符开始,向字符数组或指针指向的字符串“插入”字符串,但是这种“插入”实际上是一种覆盖。当然也可以通过临时变量将后面的字符串暂存,在“插入”所需要的字符串后再将后面的字符串再放到原先的字符串中。
尽管上面的方法也能使用c语言实现向字符串插入另一字符串的操作,但是远远没有直接使用string类的insert()函数来的方便和快捷。

同样,insert()函数也有多个重载,这里不再赘述。insert()函数的原型和用法请参考:
http://www.cplusplus.com/reference/string/string/insert/
简单举例说明:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str = "12";
	string str1 = "@#$";
	str.insert(1,1,'a'); //在下标为 1 的字符前面插入 1 个字符 ‘a’
	str.insert(3,"b3c"); //在下标为 3 的字符前面插入字符串 “b3c”
	str.insert(6,str1);  //在下标为 6 的字符前面插入string对象str1
	cout << str << endl;
}

编译运行结果:
在这里插入图片描述
八.删除字符串
与第七点插入字符串相对的操作,同样在c语言字符串操作函数中不存在这样的函数。

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str = "1a23456789B0$";
	str.erase(1,1);//从str下标为1的字符(即’a’)开始删除一个字符,得到"123456789B0$"
	str.erase(9,3);//从str下标为9的字符(’B’)开始删除3个字符,得到”123456789”
	cout << str << endl;
}

编译运行结果:
在这里插入图片描述
九.交换两个string对象的内容
同样是c语言字符串操作函数中没有的,string类提供了一个成员函数swap(),可以用于交换两个string对象的内容,无返回值。可以将调用方法的对象替换为作为参数传进来的对象,效果是一样的。

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str = "abc";
	string str1 = "ABC";
	str1.swap(str);
	cout << "str = " << str << endl;
	str1.swap(str);
	cout << "str = " << str << endl;
}

编译运行结果:
在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值