stringコンテナ

  • char文字列 … string
  • wchar_t文字列 … wstring

basic_stringテンプレートクラスを特殊化した型で、次のように宣言されています。

typedef basic_string<char> string;

これを利用すると、次のように文字列を扱えます。

std::string str = "文字列";

生成

basic_string(
    const value_type* _Ptr
);
basic_string(
    const value_type* _Ptr,
    const allocator_type& _Al
);
std::string s1;         // ""
std::string s2 = "";    // ""

std::string s3 = "ABC"; // "ABC"
std::string s4("ABC");  // "ABC"

std::string s5(3, 'A'); // "AAA"
std::string s6 = s5;    // "AAA"

文字数の取得

文字列の長さはsize()で取得できます。

size_type size( ) const;
basic_string::size | MSDN

同様の関数にlength()がありますが、これはsize()の値を返すだけで機能は同じです。

size_type length( ) const;
basic_string::length | MSDN

挿入

  • operator+= … 末尾に追加
  • push_back() … 末尾に追加
  • append() … 末尾に追加
  • insert() … 指定位置に追加
basic_string<CharType, Traits, Allocator>& insert(
   size_type _P0,
   const value_type* _Ptr
);
basic_string::insert | MSDN
std::string s = "AAA";

s.insert(1, "X"); // "AXAA"
s.insert(1, "Y"); // "AYXAA"

検索

size_type find(
    value_type _Ch,
    size_type _Off = 0
) const;
size_type find(
    const value_type* _Ptr,
    size_type _Off = 0
) const;
basic_string::find | MSDN
std::string s = "ABC ABC";
size_t p1 = s.find('C');     // 2
size_t p2 = s.find("BC");    // 1

size_t p3 = s.find("BC", 2); // 5

size_t p4 = s.find("Z");     // string::npos (-1 : 4294967295 = 2^32-1)
  • find() … 指定された文字列を最初から検索
  • rfind() … 指定された文字列を最後から検索
std::string s = "AB ABC";

size_t p1 = s.find_first_of('B');  // 1
size_t p2 = s.find_first_of("B");  // 1
size_t p3 = s.find_first_of("BC"); // 1

size_t p4 = s.find_last_of('C');       // 5
size_t p5 = s.find_first_not_of("AB"); // 2

置換

basic_string<CharType, Traits, Allocator>& replace(
   size_type _Pos1,
   size_type _Num1,
   const value_type* _Ptr
);
basic_string::replace | MSDN

_Pos1の位置から_Num1文字削除し、そこに_Ptrの文字列を挿入します。

std::string s = "AAAA";
s.replace(1, 2, "BBB"); // "ABBBA"
s.replace(2, 0, "C");   // "ABCBBA"

ある文字列を指定の文字列に置換するならば、find()で位置を検索し、そこからsize()の文字数を削除し、そこに指定文字列を挿入します。

std::string s = "ABC ABC";
std::string from = "BC";
std::string to = "X";

s.replace(s.find(from), from.size(), to); // "AX ABC"

削除

void clear( );
basic_string::clear | MSDN

指定範囲の削除

iterator erase(
    iterator _First, // 削除する最初の要素の反復子
    iterator _Last   // 削除する最後の要素の1つ前の反復子
);
iterator erase(
    iterator _It // 削除する要素の反復子 (指定の1文字だけ削除)
);
basic_string<CharType, Traits, Allocator>& erase(
    size_type _Pos = 0,     // 削除を開始する位置
    size_type _Count = npos // 削除する文字数
);
basic_string::erase | MSDN

Cスタイルの文字列への変換

const value_type *c_str( ) const;
basic_string::c_str - basic_string Class | Microsoft Learn

c_str()はNULLで終端された文字列のポインタを返します。

const value_type *data( ) const;
basic_string::data - basic_string Class | Microsoft Learn

一方でdata()はNULLで終端されていない、文字が格納された配列のアドレスを返します。

std::string s = "ABC";

const char* p = s.c_str();
const char* a = s.data();

型変換

文字列への変換

stringstreamを介すことで、文字列以外からstringを得られます。stringstream - <sstream> typedefs | Microsoft Learn

std::stringstream stream;
stream << 5.0 / 3.0;

std::string s = stream.str(); // "1.66667"
const char *c = s.c_str();

このときconst char*を得たいだけだとしても、stream.str().c_str()とはしないようにします。str()の戻り値は一時オブジェクト (temporary object) のため、それのポインタを得たとしても式を抜けたときに破棄されています。c++ - stringstream, string, and char* conversion confusion - Stack Overflow

簡単には、to_string()でも可能です。to_string - <string> 関数 | Microsoft Learn

double d = 1.0;
std::string s = std::to_string(d); // "1.000000"

数値への変換

int

int stoi(
    const string& str,
    size_t* idx = 0,
    int base = 10);
stoi - <string> functions | Microsoft Learn

double

double stod(
    const string& str,
    size_t* idx = 0);
stod - <string> functions | Microsoft Learn
std::string s1 = "1.23ABC";
double x1 = std::stod(s1); // 1.2300000000000000
double x2 = std::stod("a"); // std::invalid_argument

参考

参考書

Microsoft Learnから検索