C++ string详解及注意事项

C++ string类详解及注意事项

string类的构造函数

请看下面代码:

#include
#include
using namespace std;
int main(void)
{
	string A("ABCDEFG");           //1.创建一个string对象 并赋值为:ABCDEFG
	cout << "1.输出为:" << A << "  长度为:" << A.size() << endl << endl;


	string B(6, 'A');              //2.创建一个长度为6的string对象 其中每个元素初始化为字符 'A'
	cout << "2.输出为:" << B << "  长度为:" << B.size() << endl << endl;


	string C(A);                   //3.将一个string对象初始化另一个string对象(复制构造函数)
	cout << "3.输出为:" << C << "  长度为:" << C.size() << endl << endl;


	string D;                      //4.创建一个默认的string对象,长度为0;
	cout << "4.输出为:" << D << "  长度为:" << D.size() << endl << endl;


	string E("ABCDEFG", 3);        //5.将string对象初始化为字符串前的3个字符,即使超过字符串的大小,注意:如果用20代替3,将会导致有13个字符无法被复制到 E 的结尾处    
	cout << "5.输出为:" << E << "  长度为:" << E.size() << endl << endl;


	string F(A, 2, 5);             //6.将一个string对象初始化为对象A中从2的位置开始到结尾的字符 或 从位置2开始的5个字符(第三个参数可以不写,默认是到字符串结尾)
	cout << "6.输出为:" << F << "  长度为:" << F.size() << endl << endl;


	char temp[10] = "ABCDEFGHI";
	/*
		string中构造函数中的模板参数
		template
		string(Iter begin, Iter end);

	*/
	string G(temp + 2, temp + 8);
	/*	7.Begin和end将向指针那样指向内存中的两个位置(通常,begin和end可以是迭代器--广泛用于STL中的广义化指针),构造函数将begin和end位置之间的值对string对象进行初始化
		begin和end来自数学中,意味着包括begin,但不包括end在内的区间,也就是活end指向被使用的最后一个值后面的一个位置

		下面为模板参数为string的例子:

			sring temp("123456789");
			string G(&A[2], &A[7]);
			cout << "7.输出为:" << G << "  长度为:" << G.size() << endl << endl;

	*/
	cout << "7.输出为:" << G << "  长度为:" << G.size() << endl << endl;

	//以下是C++11新增的构造函数!!!

	const string str("AAAAAAAAAA");
	/*
		8.原型:string(string && str)                                
		类似于复制构造函数导致新建的string为str的副本,但与复制构造函数不同的是,它不保证将str视为const,这种构造函数被成为移动构造函数(move constuctor)
	*/
	string H(str);
	cout << "8.输出为:" << H << "  长度为:" << H.size() << endl << endl;


	//构造函数string(initiallizer_list il)能够让列表初始化语法用于string类,如下所示
	string I = { 'H','e','l','l','o' ,',','w','o','r','l','d' };              //对于string类来说,用处不大

	return 0;

}

由于关系运算符被重载,因此可以向对待数值变量那样对待string字符串
例如:

string A("AAAAA");
string B("BBBBB");
string C;
A+=B;                //正确
C=A+B;               //正确

string类输入

string版本的getine()将自动调整目标string对象的大小,使之刚好能够存储输入的字符,自动调整大小的功能让string版本的getline()不需要指定读取多少个字符的数值参数。

string版本中getline()函数的第一种版本,遇到分界字符(\n)时输入结束(这种情况下,将把分界字符从输入流中删除不储存它)。
例如:

string A;
getline(cin.A);  

string版本中getline()函数的第二种版本,使用指定字符来确定输入边界(遇到’L’时输入结束,不包括’L’)。

string A;
getline(cin.A,'L');

使用字符串

现在,已经介绍了使用不同方式来创建string 对象、显示string 对象的内容、将数据读取和附加到string对象中、给string对象赋值。除此之外,还能做些什么呢 ?
可以比较字符串。String 类对全部6个关系运算符都进行了重载。如果在机器排列序列中,一个对象位于另一个对象的前面,则前者被视为小于后者。如果机器排列序列为ASCII码,则数字将小于大写字符,而大写字符小于小写字符。对于每个关系运算符,都以三种方式被重载,以便能够将string 对象与另一个string对象、C - 风格字符串进行比较,并能够将C - 风格字符串与string对象进行比较 :

string snakel ("cobra") ;
string snake2 ("coral");
char snake3 [20] = "anaconda";

if (snakel < snake 2)           // operator<(const string &, const string &)
	...
if (snakel == snake3)			// operator==(const string &e, const char *)
	...
if (snake3 != snake2)			// operator!=(const char *,const string &)
	...

可以确定字符串的长度。size( )和length( )成员函数都返回字符串中的字符数:

if (snake1.length() == snake2 .size())
cout << “Both strings have the same length. \n”

为什么这两个函数完成相同的任务呢? length( )成员来自较早版本的string类,而size( )则是为提供STL兼容性而添加的。

string库还提供了相关的方法
rfind( ),find_first_of( ),find_ last_of( ),find_ first _not_of( )和 find_last_not_of(),
它们的重载函数特征标都与find( )方法相同。rfind( )方法查找子字符串或字符最后一次出现的位置: *ind_first _of( )方法在字符串中查找参数中任何一一个字符首次出现的位置。

例如,下面的语句返回r在“cobra”中的位置(即索引3),因为这是“hark"中各个字母在“cobra”首次出现的位置:
int where = snake1.find_first_of (“hark”);
find_last_of方法的功能与此相同,只是它查找的是最后一次出现的位置。 因此,下面的语句返回a在“cobra"中的位置:
int where = snake1.find first_of(“hark”);
find_frst_not_of()方法在字符串中查找第一一个不包含在参数中的字符,因此下面的语句返回 c 在“cobra”中的位置,因为“hark" 中没有 c :
int where = snakel.find_first_ not. _of (“hark”);

npos

npos变量是string类的静态成员,它的值是string对象能储存的最大字符数。

string类还提供了那些功能

string库提供了很多其他的工具,包括完成下述功能的函数:删除字符串的部分或全部内容、用一个字符串的部分或全部内容替换另–个字符串的部分或全部内容、将数据插入到字符串中或删除字符串中的数据、将一个字符串的部分或全部内容与另一个字符串的部分或全部内容进行比较、从字符串中提取子字符串、将一个字符串中的内容复制到另一个字符串中、交换两个字符串的内容。这些函数中的大多数都被重载,以便能够同时处理C-风格字符串和string对象,有人说c++之所以不适合网站开发,就是因为c++的string不是真正的字符串。

模板basic_string有四个具体化,每个具体化都有一个typedef名称:

typedef basic_string< char > string;
typedef basic_string< wchar_t > wstring;
typedef basic_string< char16_t > u16string; // C++ 11
typedef basic_string< char32_t > u32string; // C++ 11

注意事项

首先应该包含头文件

并且string不是window的产物,是属于标准c++中的内容,比char*方便使用,所以推荐作为字符串处理的数据类型。

最重要犯错误的地方是:在文件的开头地方应使用:using namespace std;避免了其它地方的不同定义,string很容易导致命名冲突。

string 非原始字符串即不以’\0’作为结束符,所以对于strlen 这些操作都是错误的, 只能通过string的size来计算大小,事实上string是基于一个模板类。

本章到此结束,有什么需要补充的请在评论区留言~
群内有各种学习资料,欢迎大家一起来学习~
如果大家遇到什么问题也欢迎大家进群讨论~
qq群:759252814
期待你的关注~
感谢大家的支持,谢谢!

你可能感兴趣的:(C++,c++,编程语言,字符串)