1. 程式人生 > >STL容器---string

STL容器---string

1、string是什麼

string是專門對字串操作的一個類。

2、string和char*的區別

char*是指向字元陣列的指標,然後系統提供了一個string.h,這個標頭檔案聲明瞭很多字串操作函式。

string則是一個類,這個類將以上的內容封裝在一起,使得字串的操作更靈活,方式更多、管理更靈活

string這個類。我們使用的時候不用考慮記憶體的分配與釋放,不用擔心越界崩潰。因為前輩在封裝string的時候,已經把幾乎所有情況都考慮到並處理了。

3、string建構函式

  • string() 無參的建構函式,示例:string str;

string類中存在一個指向字串的指標(char* m_str)。如果呼叫無參的建構函式,該指標並不是指空,而是申請了一個字元的空間,寫入‘\0’,即為表示一個空的字串。具體實現類似如下:

class mystring
{
public:
	mystring()
	{
		m_str = new char('\0');
	}
	const char* c_str() const
	{
		return m_str;
	}
private:
	char* m_str;
};
  • string(size_t length, char ch),構造一個length個ch組成的字串
string str(5, 'a');
cout << str.c_str(); //此時str為"aaaaaa",故輸出aaaaaa
  • string(const char* str) 用字串進行初始化
  • string(const char* str, size_t length) 用str的前length個字元組成字串進行初始化
  • string(string &str, size_t index, size_t length)用str的從index開始數length個字元組成字串進行初始化(該方法為拷貝構造)
  • string(string &str)用str構造物件

4、解構函式

string類解構函式主要需要釋放裝入字串的餓空間。類似實現如下:

~mystring()
	{
		if (NULL != m_str)
		{
			delete[] m_str;
		}
	}

5、string過載的運算子

  • <<(可以通過<<直接輸出string型別資料(物件))
  • >>  (輸入)
  • 賦值:+=、=
  • 下標運算:[]
  • 比較:==、>、<、>=、<=、!=
  • 計算:+

6、輸出

輸出整個字串:

  • 通過<<輸出。
  • 通過呼叫c_str()成員函式進行輸出。該函式的功能申請一塊新的空間備份該字串,然後返回該備份的首地址。

輸出單個字元:

  • 通過 [ ] 進行輸出指定字元。該方法下標越界會崩潰
  • 通過呼叫at(size_t index)成員函式進行輸出。越界會丟擲異常

7、修改

  • 修改指定元素:用[ ] 和 at()方法進行修改
  • 中間插入:insert系列方法

basic_string &insert(size_t index, const basic_string &str); //在index位置插入str

basic_string &insert(size_t index, const char* str); //在index位置插入一個字串

basic_string &insert(size_t index1, const basic_string &str,size_t index2, size_t num); //在index1的位置插入另一物件的某一部分

basic_string &insert(size_t index, size_t num, char ch); //在index處插入num個ch

  • 尾巴插入

+= :可以拼接物件、拼接字串

basic_string &append(const basic_string &str); //在尾部拼接一個物件

basic_string &append(const char* str); //尾部拼接一個字串

basic_string &append(const basic_string &str, size_t index, size_t len); //拼接一個物件的某一段

basic_string &append(const char* str, size_t num); //拼接字串前幾個

basic_string &append(size_t num, char ch); //拼接num個ch

8、基本操作

  • 比較
1、比較運算子過載
> < != == >= <=
2、比較兩個物件
int compare(const string &str);
3、比較一個物件和字串
int compare(const char* str);
4、比較本物件的一段跟引數3的物件
int compare(size_t index, size_t length, const string &str);
5、比較兩個物件中的一段
int compare(size_t index, size_t length, const string &str, size_t index2, size_t, length2);
  • 複製
1、將物件中的某一段複製進一個字元陣列中。
size_t copy(char *str, size_t num, size_t index);
  • 查詢字串
1、從指定位置開始查詢str,找到就返回起始位置
size_t find(const string &str, size_t index);
2、指定位置查詢一個字串
size_t find(const char* str, size_t index);
3、指定位置開始查詢字元
size_t find(char ch, size_t index);
4、返回字串,返回指定為位置的字串
substr(size_t index, size_t num);
5、交換兩個物件的內容
swap(string &str);

9、迭代器

  • 定義一個迭代器
string::iterator ite;//類似於一個char*指標

  • 通過迭代器遍歷string元素
string str1 = "abcdefg";
string::iterator ite;
ite = str1.begin();
for (int i = 0; i < str1.size(); i++)
{
	cout << *ite;
        //或者cout << ite[i];
	ite++;
}
  • 迭代器和指標的使用方法相同
  • 為什麼要用迭代器

因為這個迭代器是要跟演算法連線的,它適用於所有的容器。

  • 迭代器失效

在string重新申請記憶體時,迭代器失效。

string str = "abc";
string::iterator ite;
ite = str.begin();
str.append(18, 'a');

ite[3] = '3';//會出錯

10、string涉及到迭代器的成員函式

1、函式返回一個迭代器,指向字串的第一個元素
iterator begin();
2、函式返回一個迭代器,指向字串的末尾元素(最後一個元素的下一個)
iterator end();
3、在字串的末尾新增以迭代器start和end表示的字串
append(iterator start, iterator end);
4、刪除
iterator erase(iterator pos);//刪除指定元素
iterator earse(iterator start, iterator end);//刪除一段
5、插入
void insert(iterator i, size_t num, const char &h);
void insert(iterator i, iterator start, iterator end);

11、string與演算法

  • 遍歷
//標頭檔案
# include<algorithm>
void fun(char c)
{
    cout << c;
}
string str("sdbdfbdawv");
for_each(str.begin(), str.end(), fun);
  • 排序
# include<algorithm>
# include<functional>//great的標頭檔案

string str = "ddfbrgtbadf";
sort(str.begin(), str.end());//預設從小到大排序

sort(str.begin(), str.end(), greater<char>());指定從大到小排序