string

stringは可変長な文字列である。許容量を超えた文字の追加をした場合、自動的に拡張する。 末尾での文字の挿入・削除の計算量がO(1)であり、それ以外の位置の文字の挿入・削除の計算量はO(N)である。 インデックスによる文字のランダムアクセスが可能。 また、内部データの連続性は保証される。

stringを使うには、以下のマクロを用いてコードを展開する必要がある。

#include <cstl/string.h>

#define CSTL_STRING_INTERFACE(Name, Type)
#define CSTL_STRING_IMPLEMENT(Name, Type)

CSTL_STRING_INTERFACE()は任意の名前と要素の型のstringのインターフェイスを展開する。 CSTL_STRING_IMPLEMENT()はその実装を展開する。 それぞれのマクロの引数は同じものを指定すること。 また、CSTL_STRING_INTERFACE()を展開する前に、algorithm.hをインクルードすることにより、 アルゴリズムが使用可能となる。

Name
既存の型と重複しない任意の名前。コンテナの型名と関数のプレフィックスになる
Type
任意の文字の型

使用例

#include <stdio.h>
#include <ctype.h>
#include <cstl/string.h>

CSTL_STRING_INTERFACE(String, char) /* インターフェイスを展開 */
CSTL_STRING_IMPLEMENT(String, char) /* 実装を展開 */

int main(void)
{
    size_t i;
    /* 許容量が32のstringを生成 */
    String *str = String_new(32);

    /* 代入 */
    String_assign(str, "string");
    /* 末尾に追加 */
    String_append(str, " example");
    /* 先頭に挿入 */
    String_insert(str, 0, "a ");

    /* Cの文字列として出力 */
    printf("%s\n", String_c_str(str));

    for (i = 0; i < String_length(str); i++) {
        /* インデックスによる文字の読み書き */
        printf("%c, ", *String_at(str, i));
        *String_at(str, i) = toupper(*String_at(str, i));
        printf("%c\n", *String_at(str, i));
    }

    /* 使い終わったら破棄 */
    String_delete(str);
    return 0;
}

※複数のソースファイルから同じ型のコンテナを使用する場合は、 マクロ展開用のヘッダファイルとソースファイルを用意し、適宜インクルードやリンクをすればよい。


CSTL_STRING_INTERFACE(Name, Type)のNameにString, TypeにCharTを指定した場合、 以下のインターフェイスを提供する。


CSTL_NPOS

#define CSTL_NPOS  ((size_t)-1)

String

String

コンテナの型。抽象データ型となっており、以下の関数によってのみアクセスできる。


String_new()

String *String_new(size_t n);

String_delete()

void String_delete(String *self);

String_size()

size_t String_size(String *self);

String_length()

size_t String_length(String *self);

String_empty()

int String_empty(String *self);

String_capacity()

size_t String_capacity(String *self);

String_reserve()

int String_reserve(String *self, size_t n);

String_shrink()

void String_shrink(String *self, size_t n);

String_compare()

int String_compare(String *self, String *x);

String_at()

CharT *String_at(String *self, size_t idx);

String_c_str()

const CharT *String_c_str(String *self);

String_data()

const CharT *String_data(String *self);

String_assign()

String *String_assign(String *self, const CharT *cstr);

String_assign_len()

String *String_assign_len(String *self, const CharT *chars, size_t chars_len);

String_assign_c()

String *String_assign_c(String *self, size_t n, CharT c);

String_append()

String *String_append(String *self, const CharT *cstr);

String_append_len()

String *String_append_len(String *self, const CharT *chars, size_t chars_len);

String_append_c()

String *String_append_c(String *self, size_t n, CharT c);

String_push_back()

String *String_push_back(String *self, CharT c);

String_insert()

String *String_insert(String *self, size_t idx, const CharT *cstr);

String_insert_len()

String *String_insert_len(String *self, size_t idx, const CharT *chars, size_t chars_len);

String_insert_c()

String *String_insert_c(String *self, size_t idx, size_t n, CharT c);

String_replace()

String *String_replace(String *self, size_t idx, size_t len, const CharT *cstr);

String_replace_len()

String *String_replace_len(String *self, size_t idx, size_t len, const CharT *chars, size_t chars_len);

String_replace_c()

String *String_replace_c(String *self, size_t idx, size_t len, size_t n, CharT c);

String_erase()

String *String_erase(String *self, size_t idx, size_t len);

String_pop_back()

CharT String_pop_back(String *self);

String_clear()

void String_clear(String *self);

String_resize()

int String_resize(String *self, size_t n, CharT c);

String_swap()

void String_swap(String *self, String *x);

String_find()

size_t String_find(const CharT *x, const CharT *cstr, size_t idx);

String_find_len()

size_t String_find_len(const CharT *x, const CharT *chars, size_t idx, size_t chars_len);

String_find_c()

size_t String_find_c(const CharT *x, CharT c, size_t idx);

String_rfind()

size_t String_rfind(const CharT *x, const CharT *cstr, size_t idx);

String_rfind_len()

size_t String_rfind_len(const CharT *x, const CharT *chars, size_t idx, size_t chars_len);

String_rfind_c()

size_t String_rfind_c(const CharT *x, CharT c, size_t idx);

String_find_first_of()

size_t String_find_first_of(const CharT *x, const CharT *cstr, size_t idx);

String_find_first_of_len()

size_t String_find_first_of_len(const CharT *x, const CharT *chars, size_t idx, size_t chars_len);

String_find_first_of_c()

size_t String_find_first_of_c(const CharT *x, CharT c, size_t idx);

String_find_last_of()

size_t String_find_last_of(const CharT *x, const CharT *cstr, size_t idx);

String_find_last_of_len()

size_t String_find_last_of_len(const CharT *x, const CharT *chars, size_t idx, size_t chars_len);

String_find_last_of_c()

size_t String_find_last_of_c(const CharT *x, CharT c, size_t idx);

String_find_first_not_of()

size_t String_find_first_not_of(const CharT *x, const CharT *cstr, size_t idx);

String_find_first_not_of_len()

size_t String_find_first_not_of_len(const CharT *x, const CharT *chars, size_t idx, size_t chars_len);

String_find_first_not_of_c()

size_t String_find_first_not_of_c(const CharT *x, CharT c, size_t idx);

String_find_last_not_of()

size_t String_find_last_not_of(const CharT *x, const CharT *cstr, size_t idx);

String_find_last_not_of_len()

size_t String_find_last_not_of_len(const CharT *x, const CharT *chars, size_t idx, size_t chars_len);

String_find_last_not_of_c()

size_t String_find_last_not_of_c(const CharT *x, CharT c, size_t idx);