(20200423)C++ STL之string類

 容器:

順序容器:string/數組/雙端隊列/鏈表/哈希表

關聯容器:----

 

C++ string類的詳細總結(看這兩個就可以了):

【1】https://blog.csdn.net/qq_42659468/article/details/90381985

【2】https://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html

20200423

string類:

【1】專門是字符串操作的一個類,非常強大,字符串Cstring,Qstring。

【2】string是一個類,封裝之前的那些字符串操作函數如strlen等,通過string類創建的對象如str1,直接str1.strcpy就可以調用;

【3】不用考慮內存的分配和釋放,不用考慮越界,都已經處理了。

【4】string類頭文件:#include <string>   //注意string.h是C語言的頭文件

 

string類屬性:

代碼:

#include <iostream>
#include <string>
using namespace std;

int main()

{
	string str1;   
	str1 = "hello world";
	string str2("hello world");

	cout << str1.capacity()<<endl;  //返回當前容量(即string中不必增加內存即可存放的元素個數)
	cout << str1.max_size() << endl;//返回string對象中可存放的最大字符串的長度
	cout << str1.size() << endl;    //返回當前字符串的大小
	cout << str1.length() << endl;  //返回當前字符串的長度
	cout << str1.empty() << endl;   //當前字符串是否爲空
	
	str1.resize(20, '*');          //把字符串當前大小置爲20,並用字符*填充不足的部分
	cout << str1.c_str() << endl;
	//c_str()就是將C++的string轉化爲C的字符串數組,c_str()生成一個const char *指針,指向字符串的首地址
	cout << str2 << endl;//str2是一個類  不是一個字符串

	system("pause");
	return 0;
}

1】

 

2】

函數c_str()就是將C++的string轉化爲C的字符串數組,c_str()生成一個const char *指針,指向字符串的首地址

3】

4】

   
   
 

string類的輸出:

代碼:

#include <iostream>
#include <string>
using namespace std;

//string類輸出
void strCout()
{
	string str1("abcdefg");

	//輸出全部字符串
	cout << str1 << endl;//<<是重載輸出,可以輸出類str1
	cout << str1.c_str() << endl;//c_str指向字符串"abcdefg"的首地址

	//輸出單個字符
	cout << str1[0] << endl; //通過下標運算符[]輸出指定字符
	cout << str1.at(0) << endl; //at()函數輸出指定字符

	//輸出單個字符不能越界,使用try處理異常
	//cout << str1.at(10) << endl; //at()函數輸出越界
	try
	{
		str1.at(10);
	}
	catch (...)
	{
		cout << "數組輸出越界" << endl;
	}

}

int main()

{
	strCout();

	system("pause");
	return 0;
}

1】

 

string修改:

#include <iostream>
#include <string>
using namespace std;

//string類修改
void strChange()
{
	string str1("abcdefg");

	//---修改指定元素
	cout << str1 << endl;
	str1[2] = 'm';
	cout << str1 << endl;

	str1.at(2) = 'c';
	cout << str1 << endl;

	//---中間插入元素
	string str2(3, 'w'); //str2="www"
	str1.insert(2, str2);//在str1的第2個字符處插入str2,str1="abwwwcdefg"
	cout << str1 << endl;

	str1.insert(3, "zzz");//在str1的第3個字符處插入"zzz",str1="abwzzzwwcdefg"
	cout << str1 << endl;

	string str3 = "abcdefg";
	string str4 = "hello";
	str3.insert(3, str4, 3, 4);//在str3的第3個字符插入str4的第3~4個字符,str3="abclodefg"
	cout << str3 << endl;

	str4.insert(2, 3, '*');//在str4的第2字符處插入3個*,str4="he***llo"
	cout << str4 << endl;

	//---尾巴插入元素
	string str5 = "abcdefg";
	string str6 = "hello";
	str5.insert(str5.length(), 3, '*');//在字符串str5尾巴插入3個*,str5="abcdefg***";
	//str5 += "***";  //在字符串str5尾巴插入"***"
	cout << str5 << endl;

	str5 += str6;//將str6拼接到str5尾巴
	//str5.append(str6);//將str6拼接到str5尾巴
	cout << str5 << endl;

	str5.append("%%%");//在字符串str5尾巴插入"%%%"
	//str5.append(3,"%");//在字符串str5尾巴插入3個%
	cout << str5 << endl;

	//---字符串重新賦值
	string str7 = "abcdefg";
	string str8 = "hello";
	str7 = str8;//將str8賦予str7
	//str7 = "hello";//將"hello"賦予str7
	//cin >> str7;//利用輸入給str7重新賦值
	str7.assign("abcd", 2);//將"abcd"的前兩個字符賦值給str7
	str7.assign("abcd", 2,3);//將"abcd"的後兩個字符賦值給str7
	cout << str7 << endl;
	
	//---字符串刪除
	string str9 = "abcdefg";
	str9.erase(2,3);//從第2個字符開始,刪除3個字符
	//str9.erase(0, str9.length());//清理從開始到末尾的字符,即清空字符串
	cout << str9 << endl;

}

int main()

{
	strChange();

	system("pause");
	return 0;
}

 

1】

2】

 

3】

4】

 

5】

6】

   
 

字符串比較:

#include <iostream>
#include <string>
using namespace std;

//string類修改
void strCompare()
{
	string str1("abcd");
	string str2("abcd");
	string str3("abc");

	cout << (str1.compare("abcd")) << endl;//完全相等,返回0
	cout << (str1 == str2) << endl;//完全相等,返回0
	cout << (str1.compare("dcba")) << endl;//返回小於0
	cout << (str1.compare("ab")) << endl;//返回大於0
	cout << (str1.compare(0, 2, str2, 0, 2)) << endl; //str1[0-2]和str2[0-2]比較,//完全相等,返回0
	cout << (str1.compare(0, 2, "abc", 0, 2)) << endl; //str1[0-2]和"abc"[0-2]比較,//完全相等,返回0

}

int main()

{
	strCompare();

	system("pause");
	return 0;
}

1】

 

2】

 

 

 

字符串複製:

#include <iostream>
#include <string>
using namespace std;


void strCopy()
{
	string str1("abcd");
	string str2("***%%%");

	char *s1 = new char[10];
	memset(s1, 0, 10);//s1初始化爲0
	//char s1[10]={0};  //或者定義一個字符數組
	str1.copy(s1, 3, 1);//從str1的第一個字符開始賦值3個字符給s1
	cout << s1 << endl;  //s1="bcd"
	delete s1;

	const char* s2 = str2.data();//將string類str2轉爲字符串數組,返回給s2

	str1 = str2.substr(2);   //提取子串,提取出 str2 的 下標爲2 到末尾,給 str1
	cout << str1 << endl;

	str1 = str2.substr(2, 3);  //提取子串,提取出 str2 的 下標爲2 開始,提取3個字符,給 str1
	cout << str1 << endl;

}


int main()

{
	strCopy();

	system("pause");
	return 0;
}

1】

 

2】

 

 

 

成員操作函數:

 

 
 

查找字符串:

 

1】

 

2】

 

3】

 

4】

 

20200425

string迭代器:

#include <iostream>
#include <string>
using namespace std;

//string 迭代器

void funIterator()
{
	string str1("abcdefg");

	//定義一個string迭代器
	string::iterator ite; //ite是一個指向string類的迭代器, 本質是一個char *指針

	
	ite = str1.begin(); //ite指向str1字符串首地址
	//ite = str1.end(); //ite指向str1最後一個字符的下一個位置
	//使用ite迭代器遍歷str1
	for (size_t i = 0; i < str1.size(); i++)  //str1.size()返回無符號整型size_t
	{
		cout << *ite << ' ';//string迭代器使用方法類似於指針
		ite++;
	}

	//下標運算
	ite = str1.begin(); //ite重新指向str1字符串首地址
	for (size_t i = 0; i < str1.size(); i++)  //str1.size()返回無符號整型size_t
	{
		cout << ite[i] << ' ';//下標運算
	}

	//
	ite = str1.begin(); //ite重新指向str1字符串首地址
	for (ite; ite != str1.end();ite++)  
	{
		cout << *ite << ' ';
	}

	//迭代器失效
	//str1.append(18, 'a');  //給str1末尾添加18個a,這時str1發生改變
	//ite[3] = 'w';//無法再繼續使用ite,要給ite重新賦值

	//操作函數使用迭代器
	string str2("abcd");
	string str3("efg");
	str2.append(str3.begin(),str3.end()-1);  //在str2的尾部添加str3的第1個到最後一個
	cout << str2 << endl;

	str2.insert(str2.begin()+2, 3,'m');//在str2的第二個字符開始,插入3個m

}


int main()

{
	funIterator();
	system("pause");
	return 0;
}

 

1】

2】

3】

4】

5】

6】

   
 

 

string迭代器主要還是用於鏈接容器和算法,實現泛型編程:

 

1】

算法頭文件:  #include <algorithm>

 

2】遍歷

3】排序:

 

#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
using namespace std;

//迭代器鏈接容器(string類)和算法
void show(char c)  //string類元素是char(int),這裏就是char(int)
{
	cout << c;
}
void funForeach()   
{
	string str1("dcagabe");
	//string str1("5648123");

	for_each(str1.begin(),str1.end(),show);//遍歷

	sort(str1.begin(), str1.end());//排序,默認從小到大排序
	cout << endl;
	for_each(str1.begin(), str1.end(), show);//遍歷

	sort(str1.begin(), str1.end(),greater<char>());//排序,從大到小排序(greater是仿函數,#include <functional>)


}


int main()

{
	funForeach();
	system("pause");
	return 0;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章