C++のstringクラスの使い方について詳しく解説

この記事では、C++のstringクラスについて詳しく解説します。

stringクラスは、文字列を簡単に扱うための便利なツールです。

この記事を読むことで、stringクラスの基本的な使い方から、文字列の結合や検索、置換などの高度な操作方法までを学ぶことができます。

また、パフォーマンスを向上させるためのヒントや、正規表現やstringstreamを使った応用的な使い方も紹介します。

初心者の方でも理解しやすいように、サンプルコードとその実行結果を交えて説明していますので、ぜひ参考にしてください。

目次から探す

stringクラスの基本

stringクラスとは

C++のstringクラスは、標準ライブラリに含まれる文字列操作のためのクラスです。

C言語の文字配列(char配列)に比べて、より直感的で使いやすいインターフェースを提供します。

stringクラスは、文字列の長さを自動的に管理し、さまざまな文字列操作を簡単に行うことができます。

stringクラスの利点

stringクラスの主な利点は以下の通りです:

  • 動的メモリ管理:文字列の長さを自動的に管理し、必要に応じてメモリを再割り当てします。
  • 豊富なメンバ関数:文字列の操作(結合、比較、検索、置換など)を簡単に行うためのメンバ関数が多数用意されています。
  • 安全性:C言語の文字配列に比べて、バッファオーバーフローなどのエラーが発生しにくいです。

stringクラスの基本的な使い方

以下に、stringクラスの基本的な使い方を示します。

#include <iostream>
#include <string>
int main() {
    std::string str1 = "Hello, ";
    std::string str2 = "World!";
    std::string str3 = str1 + str2; // 文字列の結合
    std::cout << str3 << std::endl; // 出力: Hello, World!
    return 0;
}

stringクラスの初期化と代入

文字列リテラルからの初期化

stringクラスのオブジェクトは、文字列リテラルから簡単に初期化できます。

#include <iostream>
#include <string>
int main() {
    std::string str = "Hello, World!";
    std::cout << str << std::endl; // 出力: Hello, World!
    return 0;
}

他のstringオブジェクトからの初期化

既存のstringオブジェクトから新しいstringオブジェクトを初期化することもできます。

#include <iostream>
#include <string>
int main() {
    std::string str1 = "Hello, World!";
    std::string str2 = str1; // str1からstr2を初期化
    std::cout << str2 << std::endl; // 出力: Hello, World!
    return 0;
}

文字配列からの初期化

C言語の文字配列からもstringオブジェクトを初期化できます。

#include <iostream>
#include <string>
int main() {
    char charArray[] = "Hello, World!";
    std::string str = charArray;
    std::cout << str << std::endl; // 出力: Hello, World!
    return 0;
}

代入演算子の使い方

stringクラスのオブジェクトには、代入演算子(=)を使って新しい値を代入できます。

#include <iostream>
#include <string>
int main() {
    std::string str1 = "Hello";
    std::string str2;
    str2 = str1; // str1の値をstr2に代入
    std::cout << str2 << std::endl; // 出力: Hello
    return 0;
}

stringクラスのメンバ関数

文字列の長さを取得する

size()とlength()の違い

stringクラスには、文字列の長さを取得するためのsize()length()というメンバ関数があります。

これらは同じ機能を持ち、どちらを使っても問題ありません。

#include <iostream>
#include <string>
int main() {
    std::string str = "Hello, World!";
    std::cout << "Size: " << str.size() << std::endl; // 出力: Size: 13
    std::cout << "Length: " << str.length() << std::endl; // 出力: Length: 13
    return 0;
}

文字列の結合

+演算子を使った結合

+演算子を使って、簡単に文字列を結合できます。

#include <iostream>
#include <string>
int main() {
    std::string str1 = "Hello, ";
    std::string str2 = "World!";
    std::string str3 = str1 + str2;
    std::cout << str3 << std::endl; // 出力: Hello, World!
    return 0;
}

append()メンバ関数を使った結合

append()メンバ関数を使って文字列を結合することもできます。

#include <iostream>
#include <string>
int main() {
    std::string str1 = "Hello, ";
    std::string str2 = "World!";
    str1.append(str2);
    std::cout << str1 << std::endl; // 出力: Hello, World!
    return 0;
}

部分文字列の取得

substr()メンバ関数の使い方

substr()メンバ関数を使って、文字列の一部を取得できます。

#include <iostream>
#include <string>
int main() {
    std::string str = "Hello, World!";
    std::string substr = str.substr(7, 5); // "World"を取得
    std::cout << substr << std::endl; // 出力: World
    return 0;
}

文字列の比較

==演算子を使った比較

==演算子を使って、文字列を比較できます。

#include <iostream>
#include <string>
int main() {
    std::string str1 = "Hello";
    std::string str2 = "Hello";
    if (str1 == str2) {
        std::cout << "str1 and str2 are equal" << std::endl; // 出力: str1 and str2 are equal
    }
    return 0;
}

compare()メンバ関数を使った比較

compare()メンバ関数を使って、文字列を比較することもできます。

#include <iostream>
#include <string>
int main() {
    std::string str1 = "Hello";
    std::string str2 = "Hello";
    if (str1.compare(str2) == 0) {
        std::cout << "str1 and str2 are equal" << std::endl; // 出力: str1 and str2 are equal
    }
    return 0;
}

文字列の検索

find()メンバ関数の使い方

find()メンバ関数を使って、文字列内の特定の文字列を検索できます。

#include <iostream>
#include <string>
int main() {
    std::string str = "Hello, World!";
    size_t pos = str.find("World");
    if (pos != std::string::npos) {
        std::cout << "Found 'World' at position: " << pos << std::endl; // 出力: Found 'World' at position: 7
    }
    return 0;
}

rfind()メンバ関数の使い方

rfind()メンバ関数を使って、文字列内の特定の文字列を逆方向から検索できます。

#include <iostream>
#include <string>
int main() {
    std::string str = "Hello, World! World!";
    size_t pos = str.rfind("World");
    if (pos != std::string::npos) {
        std::cout << "Found 'World' at position: " << pos << std::endl; // 出力: Found 'World' at position: 14
    }
    return 0;
}

文字列の置換

replace()メンバ関数の使い方

replace()メンバ関数を使って、文字列の一部を置換できます。

#include <iostream>
#include <string>
int main() {
    std::string str = "Hello, World!";
    str.replace(7, 5, "C++");
    std::cout << str << std::endl; // 出力: Hello, C++!
    return 0;
}

文字列の挿入と削除

insert()メンバ関数の使い方

insert()メンバ関数を使って、文字列に新しい文字列を挿入できます。

#include <iostream>
#include <string>
int main() {
    std::string str = "Hello, World!";
    str.insert(7, "Beautiful ");
    std::cout << str << std::endl; // 出力: Hello, Beautiful World!
    return 0;
}

erase()メンバ関数の使い方

erase()メンバ関数を使って、文字列の一部を削除できます。

#include <iostream>
#include <string>
int main() {
    std::string str = "Hello, Beautiful World!";
    str.erase(7, 10);
    std::cout << str << std::endl; // 出力: Hello, World!
    return 0;
}

stringクラスの非メンバ関数

getline()関数の使い方

getline()関数を使って、標準入力から一行の文字列を読み取ることができます。

#include <iostream>
#include <string>
int main() {
    std::string str;
    std::cout << "Enter a string: ";
    std::getline(std::cin, str);
    std::cout << "You entered: " << str << std::endl;
    return 0;
}

stoi()とto_string()関数の使い方

stoi()関数を使って、文字列を整数に変換できます。

また、to_string()関数を使って、整数を文字列に変換できます。

#include <iostream>
#include <string>
int main() {
    std::string str = "123";
    int num = std::stoi(str);
    std::cout << "Integer: " << num << std::endl; // 出力: Integer: 123
    int num2 = 456;
    std::string str2 = std::to_string(num2);
    std::cout << "String: " << str2 << std::endl; // 出力: String: 456
    return 0;
}

stringクラスのイテレータ

イテレータの基本

stringクラスは、文字列の各文字にアクセスするためのイテレータを提供しています。

イテレータは、文字列の先頭から末尾まで順にアクセスするためのオブジェクトです。

イテレータを使った文字列の操作

begin()とend()メンバ関数

begin()end()メンバ関数を使って、文字列の先頭と末尾のイテレータを取得できます。

#include <iostream>
#include <string>
int main() {
    std::string str = "Hello, World!";
    for (auto it = str.begin(); it != str.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl; // 出力: H e l l o ,   W o r l d !
    return 0;
}

rbegin()とrend()メンバ関数

rbegin()rend()メンバ関数を使って、文字列の逆方向のイテレータを取得できます。

#include <iostream>
#include <string>
int main() {
    std::string str = "Hello, World!";
    for (auto it = str.rbegin(); it != str.rend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl; // 出力: ! d l r o W   , o l l e H
    return 0;
}

stringクラスの高度な使い方

正規表現を使った文字列操作

C++11以降、標準ライブラリに正規表現が追加され、regexクラスを使って文字列操作が可能になりました。

#include <iostream>
#include <string>
#include <regex>
int main() {
    std::string str = "Hello, World!";
    std::regex pattern("World");
    std::string replaced = std::regex_replace(str, pattern, "C++");
    std::cout << replaced << std::endl; // 出力: Hello, C++!
    return 0;
}

stringstreamを使った文字列操作

stringstreamクラスを使って、文字列の入出力を行うことができます。

#include <iostream>
#include <string>
#include <sstream>
int main() {
    std::string str = "123 456 789";
    std::stringstream ss(str);
    int num;
    while (ss >> num) {
        std::cout << num << " ";
    }
    std::cout << std::endl; // 出力: 123 456 789
    return 0;
}

stringクラスのパフォーマンス

メモリ管理とパフォーマンス

stringクラスは動的にメモリを管理しますが、大量の文字列操作を行う場合、パフォーマンスに影響を与えることがあります。

特に、頻繁な文字列の結合や置換は、メモリの再割り当てを引き起こす可能性があります。

効率的な文字列操作のためのヒント

  • 予約メモリの使用reserve()メンバ関数を使って、あらかじめ必要なメモリを確保することで、メモリの再割り当てを減らすことができます。
  • +=演算子の使用+演算子よりも+=演算子を使った方が効率的です。
#include <iostream>
#include <string>
int main() {
    std::string str;
    str.reserve(100); // 100文字分のメモリを予約
    str += "Hello, ";
    str += "World!";
    std::cout << str << std::endl; // 出力: Hello, World!
    return 0;
}

まとめ

C++のstringクラスは、文字列操作を簡単かつ安全に行うための強力なツールです。

基本的な使い方から高度な操作まで、さまざまな機能を提供しています。

この記事で紹介した内容を参考にして、stringクラスを効果的に活用してください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

目次から探す