C++ string支援設定器方法詳解

2020-07-16 10:04:38
設定器是 STL 的重要內容。使用 STL 必然會涉及容器,而容器中儲存了大量的數值,必然需要分配記憶體空間。設定器的作用就是為容器分配記憶體。

設定器最早是為將記憶體模型抽象化而提出的。所以使用記憶體設定器分配記憶體時,是按物件的個數進行的,而不是按位元組數。這有別於原來的 new [] 和 new 操作符。設定器最大的優點在於,設定器實現了將演算法、容器與物理儲存細節分隔。設定器可以提供一套分配與釋放記憶體的標準方式,並提供用作指標型別和參照型別的標準名稱。目前而言,設定器僅是一種純粹的抽象。行為上類似分配器的型別都可看作設定器。

C++ STL 提供了標準分配器,目的是為使用者提供更多的服務。basic_string 模板以及 string 類均提供了對常見設定器的相關支援。basic_string 類別範本中包含 1 個設定器型別的成員 allocator_type。對於 string 物件,allocator_type 可以作為設定器類的物件使用;對 string 類而言,allocator_type 等價於 allocator<char>,即分配資料型別為 char 的記憶體,便於 string 類的物件儲存 char 型字元。

同時 basic_string 類別範本的第 3 個引數也是設定器模板引數。basic_string 類別範本的形式如下:

template <class CharType, class Traits = char_traits <CharType>, class Allocator=allocator<CharType>> class basic_string

而 string 類的宣告形式如下:

typedef basic_string <char> string;

對於 basic_string 類別範本,其第 1 個引數是 CharType,第 2 個引數和第 3 個引數的預設值和 CharType 均相關。在宣告 string 類時,引數 char 取代模板中的 CharType,string 即成為模板的範例,同時模板中的第 3 個引數成為 "class Allocator = allocator <char>",其意義為 string 中物件的記憶體型別為 char 型。

string 類還提供了 1 個和設定器相關的函數 get_allocator(),其函數原型為:

allocator_type string:: get_allocator () const

函數返回 string 類的記憶體模型物件,可以用於構造新的字串。以如下程式為例介紹該函數的使用方法。
#include <iostream>
#include <string>
#include <memory>
using namespace std;
int main ()
{
    string s("abed");
    basic_string <char> s1 (s.get_allocator());
    basic_string <char> :: allocator_type aT = s1.get_allocator ();
    string::size_type se = s1.size ();
    cout << se << endl;
}
由於在 string 類中,allocator 是保護成員,難以直接呼叫對記憶體的直接設定。對於設定器,一般情況下都是使用預設設定器。對於本節內容,讀者了解即可。