c++ --- STL --- string

c++最爲重要的一大組成部分就是STL,它不僅僅是一個可複用的組件庫,而且是一個包羅數據結構和算法的軟件框架。STL的六大組件:
在這裏插入圖片描述

一:序列式容器, 有string,vector, list, deque

二 : 關聯式容器, 有set, multiset, map, mulmap, hash_set, hash_map, hash_multiset, hash_multimap

三: 其他的雜項: stack, queue, valarray, bitset
序列式容器:是一種各元素之間有順序關係的線性表,是一種線性結構的可序羣集。順序性容器中的每個元素均有固定的位置,除非用刪除或插入的操作改變這個位置。
關聯式容器 :和順序性容器不一樣,關聯式容器是非線性的樹結構,更準確的說是二叉樹結構。各元素之間沒有嚴格的物理上的順序關係,也就是說元素在容器中並沒有保存元素置入容器時的邏輯順序。關聯式容器另一個顯著的特點是它是以鍵值的方式來保存數據,就是說它能把關鍵字和值關聯起來保存,而順序性容器只能保存一種(可以認爲它只保存關鍵字,也可以認爲它只保存值)。
容器適配器: 是一個比較抽象的概念, C++的解釋是:適配器是使一事物的行爲類似於另一事物的行爲的一種機制。容器適配器是讓一種已存在的容器類型採用另一種不同的抽象類型的工作方式來實現的一種機制。其實僅是發生了接口轉換。那麼你可以把它理解爲容器的容器,它實質還是一個容器,只是他不依賴於具體的標準容器類型,可以理解是容器的模版。或者把它理解爲容器的接口,而適配器具體採用哪種容器類型去實現,在定義適配器的時候可以由你決定。

一.學習string

1.string的特性

  • string式表示字符串的字符串類。
  • 該類的接口與常規容器的接口基本相同,再添加了一些string的常規操作。
  • string在底層實際上是basic_string模板類的別名,typedef basic_string<char , char_traits , allocator , >string;
  • 不能操作多字節或者變長字節的序列。

2.string類對象的常見拷貝

string() 構造空的string類對象,即空字符串
string(const char* s) 用C-string來構造string類對象
string(size_t n, char c) string類對象中包含n個字符c
string(const string&s) 拷貝構造函數
string(const string&s, size_t n) 用s中的前n個字符構造新的string類對象

void TestString() 
{    
	string s1;                // 構造空的string類對象s1    
	string s2("hello bit");   // 用C格式字符串構造string類對象s2    
	string s3(10, 'a');       // 用10個字符'a'構造string類對象s3    
	string s4(s2);            // 拷貝構造s4    
	string s5(s3, 5);         // 用s3中前5個字符構造string對象s5 
}

3.string對象的容量操作

size_t size() const 返回字符串有效字符長度
size_t length() const 返回字符串有效字符長度
size_t capacity ( ) const 返回空間總大小
bool empty ( ) const 檢測字符串釋放爲空串,是返回true,否則返回false
void clear() 清空有效字符
void resize ( size_t n, char c ) 將有效字符的個數該成n個,多出的空間用字符c填充
void resize ( size_t n ) 將有效字符的個數改成n個,多出的空間用0填充
void reserve ( size_t res_arg=0 ) 爲字符串預留空間

注意:

  • (1)size()和length()方法底層實現原理完全相同,引入size()的原因是爲了與其他容器的接口保持一致,一般情況下都是用size();
  • (2)clear()只是將string內的有效字符串清空,不改變底層空間的大小。
  • (3) resize(size_t n) 與 resize(size_t n, char c)都是將字符串中有效字符個數改變到n個,不同的是當字 符個數增多時:resize(n)用0來填充多出的元素空間,resize(size_t n, char c)用字符c來填充多出的 元素空間。注意:resize在改變元素個數時,如果是將元素個數增多,可能會改變底層容量的大 小,如果是將元素個數減少,底層空間總大小不變。
  • (4)reverse(size_t res_arg = 0);爲string預留空間,不改變有效元素的個數,當reverse的參數小於string的底層空間總大小的時候,reverse不會改變容量的大小。

4.string類對象的訪問操作

char& operator[] ( size_t pos ) 返回pos位置的字符,const string類對象調用
const char& operator[] ( size_t pos ) const 返回pos位置的字符,非const string類對象調用

5.string類對象的修改操作

void push_back(char c) 在字符串後尾插字符c
string& append (const char* s); 在字符串後追加一個字符串
string& operator+=(const string& str) 在字符串後追加字符串str
string& operator+=(const char* s) 在字符串後追加C個數字符串
string& operator+=(char c) 在字符串後追加字符c
const char* c_str( )const 返回C格式字符串
size_t find (char c, size_t pos = 0)const 從字符串pos位置開始往後找字符c,返回該字符在 字符串中的位置
size_t rfind(char c, size_t pos = npos) 從字符串pos位置開始往前找字符c,返回該字符在 字符串中的位置
string substr(size_t pos = 0, size_t n = npos)const 在str中從pos位置開始,截取n個字符,然後將其 返

二.模擬實現string類

class String
{
public:
	String(const char* str = "")//初始化
	{
		if (nullptr == str)
		{
			assert(false);
			return;
		}
		_str = new char[strlen(str) + 1];
		strcpy(_str, str);
	}

	String(const String& s)//拷貝賦值
		:_str(new char[strlen(s._str) + 1])
	{
		strcpy(_str, s._str);
	}

	String& operator=(const String& s)//運算符重載
	{
		if (this != &s)
		{
			char* pstr = new char[strlen(s._str) + 1];
			strcpy(pstr, s._str);
			delete[] _str;
			_str = pstr;
		}
		return *this;
	}

	~String()
	{
		if (_str)
		{
			delete[] _str;
			_str = nullptr;
		}
	}
private:
	char* _str;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章