文字列アルゴリズム
効率的に検索と分割を行います
「文字列アルゴリズム」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- string_viewを使う理由
- ビューの作成
- 落とし穴とライフタイム
- 文字列アルゴリズム