0Pricing
C++ Academy · レッスン

文字列アルゴリズム

効率的に検索と分割を行います

「文字列アルゴリズム」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

findによる検索

findは部分文字列のインデックスを返し、見つからない場合はnposを返します。コピーせずにビューを直接処理できます。

#include <iostream>
#include <string_view>
int main() {
    std::string_view sv = "key=value";
    auto pos = sv.find('=');
    std::cout << pos << "\n"; // 3
}

nposの確認

検索結果をインデックスとして使用する前に、必ずstd::string_view::nposと比較してください。

#include <iostream>
#include <string_view>
int main() {
    std::string_view sv = "abc";
    if (sv.find('z') == std::string_view::npos)
        std::cout << "not found\n";
}

プレフィックスとサフィックスの確認

starts_withとends_with(C++20)を使うと意図が明確になり、手作業による部分文字列の比較を避けられます。

#include <iostream>
#include <string_view>
int main() {
    std::string_view sv = "report.pdf";
    std::cout << sv.starts_with("report") << "\n";
    std::cout << sv.ends_with(".pdf") << "\n";
}

フィールドの抽出

findとsubstrを組み合わせると、新しい文字列を確保せずにキーと値のペアを分割できます。

#include <iostream>
#include <string_view>
int main() {
    std::string_view sv = "name=Ada";
    auto eq = sv.find('=');
    std::cout << sv.substr(0, eq) << " : " << sv.substr(eq + 1) << "\n";
}

区切り文字による分割

区切り文字を繰り返し検索して部分ビューを取り出すことで、トークンを順に処理できます。各トークンは単なるビューです。

#include <iostream>
#include <string_view>
int main() {
    std::string_view sv = "a,b,c";
    size_t start = 0, pos;
    while ((pos = sv.find(',', start)) != std::string_view::npos) {
        std::cout << sv.substr(start, pos - start) << "\n";
        start = pos + 1;
    }
    std::cout << sv.substr(start) << "\n";
}

末尾からの検索

rfindは後方から検索します。ファイル拡張子や最後の区切り文字を取得するのに便利です。

#include <iostream>
#include <string_view>
int main() {
    std::string_view path = "/usr/local/bin";
    auto slash = path.rfind('/');
    std::cout << path.substr(slash + 1) << "\n"; // bin
}

空白のトリミング

find_first_not_ofとfind_last_not_ofをremove_prefixやremove_suffixと組み合わせると、コピーせずに空白を取り除けます。

#include <iostream>
#include <string_view>
int main() {
    std::string_view sv = "  hi  ";
    sv.remove_prefix(sv.find_first_not_of(" "));
    sv.remove_suffix(sv.size() - 1 - sv.find_last_not_of(" "));
    std::cout << "[" << sv << "]\n"; // [hi]
}

ビューの比較

ビューは辞書順比較のための==とcompareをサポートします。ポインターではなく文字を比較します。

#include <iostream>
#include <string_view>
int main() {
    std::string_view a = "apple", b = "apple";
    std::cout << (a == b) << "\n"; // 1
}

出現回数のカウント

findを使うループで、見つかるたびに検索位置を先へ進めると、文字や部分文字列の出現回数を数えられます。

#include <iostream>
#include <string_view>
int main() {
    std::string_view sv = "mississippi";
    int count = 0;
    for (size_t p = sv.find('s'); p != std::string_view::npos; p = sv.find('s', p + 1)) ++count;
    std::cout << count << "\n"; // 4
}

アルゴリズムは確保なしで動作

これらの操作はすべて同じ基になるバッファーを処理します。トークンやトリミング結果は部分ビューであり、std::stringを構築するまでヒープ確保は発生しません。

ライフタイムに注意

これらのアルゴリズムが生成する部分ビューは、元のバッファーとライフタイムを共有します。元の文字列より長く存続させないでください。

理解度チェック

string_viewのアルゴリズムについての理解度を確認しましょう。

まとめ

ビューに対する文字列アルゴリズムについて学びました。

  • findやrfindは位置またはnposを返します。
  • starts_withやends_withでプレフィックスとサフィックスを確認できます。
  • 分割、トリミング、トークン化では、メモリ確保なしの部分ビューが生成されます。
  • 部分ビューは元のデータとライフタイムを共有するため、ダングリングに注意してください。

よくある質問

「文字列アルゴリズム」レッスンは無料ですか?

はい。「文字列アルゴリズム」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「文字列アルゴリズム」で何を学びますか?

効率的に検索と分割を行います ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「文字列アルゴリズム」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. string_viewを使う理由
  2. ビューの作成
  3. 落とし穴とライフタイム
  4. 文字列アルゴリズム
← C++ Academyに戻る