「C++」の版間の差分
(class) |
(String) |
||
40行目: | 40行目: | ||
純粋仮想関数が存在する場合、継承必須になり、そのクラスはインスタンスを生成できない。 | 純粋仮想関数が存在する場合、継承必須になり、そのクラスはインスタンスを生成できない。 | ||
== String == | |||
=== Replace === | |||
std::string::replaceが基本。 | |||
文字列の特定範囲を指定文字列で置換する。破壊的操作。 | |||
std::findの検索と併用する必要がある。 | |||
その他に、algorithmのstd::replaceもある。こちらはcharg型などの1文字同士であれば全置換できる。 | |||
findと文字列単位だとwhileなど。 | |||
/// "a, b".replaceFirst(", ", "|") 相当の文字列置換 | |||
std::string s = "a, b"; | |||
std::string t = ", "; // 検索文字列 | |||
auto pos = s.find(t); // 検索文字列が見つかった位置 (pos == 1) | |||
auto len = t.length(); // 検索文字列の長さ (len == 2) | |||
if (pos != std::string::npos) { | |||
s.replace(pos, len, "|"); // s == "a|b" | |||
} | |||
=== Slice === | |||
特定文字列で検索して、一部分を切り出したいことがよくある。jsonの末端など。 | |||
std::string::size_type pos = find("."); | |||
=== startsWith === | |||
情報源: [https://marycore.jp/prog/cpp/starts-with-prefix-search/ C++ 文字列型で前方一致の検索【std::string startsWith/hasPrefix 接頭辞判定】 | MaryCore]。 | |||
std::string s = "abc"; // 検索先の文字列 | |||
std::string t = "ab"; // 検索文字列 | |||
if (s.size() >= t.size() && std::equal(std::begin(t), std::end(t), std::begin(s))) { | |||
puts("文字列`ab`で始まる文字列です"); | |||
} | |||
=== Case === | |||
情報源 | |||
* [https://kaworu.jpn.org/kaworu/2007-04-13-1.php C++ string型の文字列を大文字から小文字へ、小文字から大文字へ変換する] | |||
* [https://ez-net.jp/article/88/fvNmqJRJ/XadygfBS_HpK/ std::string の小文字を大文字に変換する - C++ プログラミング] | |||
#include <algorithm> | |||
std::string string = ""; | |||
std::transform(string.cbegin(), string.cend(), string.begin(), std::toupper); |
2023年11月28日 (火) 14:41時点における版
explicit
情報源: c++のexplicit指定子の使い方まとめ|コウモリのちょーおんぱ。
explicitがあるとコピーコンストラクター (=代入) が禁止される。意図しない型変換などを抑止するらしい。
std::make_unique
情報源: c++ - make_uniqueの利点 - スタック・オーバーフロー。
unique_ptr生成時に使う。newするよりいい。処理が1回で済む。
class
interface
情報源: C++ インターフェースの実現方法【インタフェースクラスとダックタイピング】 | MaryCore。
C++でJavaなどのinterface (関数、staticのみの派生用クラス) 相当の実現には若干工夫が必要となる。
- 全ての関数が純粋仮想関数: virtual function() = 0
- 仮想デストラクター: virtual ~destructior()
virtualは関数にオーバーライドを許可する。
仮想デストラクターがあることで、派生先側でのデストラクター呼び出しを許容する。
abstract
情報源:
- 抽象クラス - C++入門
- c++ - Can a non-virtual function be equal to 0? - Stack Overflow
- 抽象クラス(C++) - 超初心者向けプログラミング入門
抽象クラス。純粋仮想関数が1個以上存在するクラス。
ベースクラスにvirtual function() = 0;がある場合、派生クラスではvirtualは別になくてもいい。
function() = 0; で同じ意味になる。
純粋仮想関数が存在する場合、継承必須になり、そのクラスはインスタンスを生成できない。
String
Replace
std::string::replaceが基本。
文字列の特定範囲を指定文字列で置換する。破壊的操作。
std::findの検索と併用する必要がある。
その他に、algorithmのstd::replaceもある。こちらはcharg型などの1文字同士であれば全置換できる。
findと文字列単位だとwhileなど。
/// "a, b".replaceFirst(", ", "|") 相当の文字列置換 std::string s = "a, b"; std::string t = ", "; // 検索文字列 auto pos = s.find(t); // 検索文字列が見つかった位置 (pos == 1) auto len = t.length(); // 検索文字列の長さ (len == 2) if (pos != std::string::npos) { s.replace(pos, len, "|"); // s == "a|b" }
Slice
特定文字列で検索して、一部分を切り出したいことがよくある。jsonの末端など。
std::string::size_type pos = find(".");
startsWith
情報源: C++ 文字列型で前方一致の検索【std::string startsWith/hasPrefix 接頭辞判定】 | MaryCore。
std::string s = "abc"; // 検索先の文字列 std::string t = "ab"; // 検索文字列 if (s.size() >= t.size() && std::equal(std::begin(t), std::end(t), std::begin(s))) { puts("文字列`ab`で始まる文字列です"); }
Case
情報源
#include <algorithm> std::string string = ""; std::transform(string.cbegin(), string.cend(), string.begin(), std::toupper);