.. highlight:: c++ ====================== Tips ====================== オーバーフローに注意 ====================== 次のコードはyukicoder No.51の解答例である。 .. literalinclude:: cpp/overflow/main.cpp :caption: :math:`1 \leq W \leq 10^5, 1 \leq D \leq 10^5` このコードはオーバーフローすることがある。 :: ((D-i)*(D-i)) は全てint型から成るので、この一時的な結果はint型として保存される。しかし、この計算結果は最悪の場合int型の範囲を越えるためオーバーフローする場合がある。 オーバーフローさせないためにはDまたはiをlong long型にすればよい。 もう面倒くさいときは次のマクロ使っちゃえ(笑) :: #define int long long 小数点切り上げ ===================== 小数点切り上げにceil関数を使うと誤差が問題になることがある。 次のようなコードを用いれば安全である。 :: a/b + (a%b==0 ? 0 : 1); std::string ======================== 文字列検索 ----------------------- findメソッドは頭から一致する文字列を検索する。戻り値はstd::string::size_typeで、整数型へのキャストも可能だが、std::string::nposとの比較の際に問題がでうるらしいので面倒くさがらずにsize_type型で受け取るようにすること。 :: std::string::size_type index = str.find("abc"); if(index == std::string::npos) std::cout << "not find"; rfindは後ろから検索する。 :: std::string::size_type index = str.rfind("abc"); 文字検索 -------------------- 文字検索にはfind_first_of、find_last_ofを使う。前者は頭から、後者は後ろから一致する文字を検索する。 :: std::string::size_type index = str.find_first_of("abc"); std::string::size_type index2 = str.find_last_of("abc"); これは'a'または'b'又は'c'に一致する最初の位置を返す。 tokenによる文字列分割 ------------------------- .. literalinclude:: cpp/split/split.cpp 文字列挿入 -------------- :: std::string str("abc"); str.insert(2, "d");//添字2の要素の前に挿入 unsigned intの桁数取得 ======================== .. literalinclude:: cpp/digit/digit.cpp std::vector ======================== 特定の値を削除する -------------------- erase-removeイディオムと呼ばれる方法が使える。 :: v.erase(std::remove(v.begin(),v.end(),100), v.end());//100に一致する要素を削除する。 std::removeは要素の削除を行わない。指定した値に一致する要素をコンテナの末尾に移動してその先頭iteratorを返すだけである。std::vector::eraseは指定した範囲を実際に削除する。このため上述のコードは所望の動作をする。 自作ライブラリ =========================== あると便利かな、と思うメソッドを作ってみた。バグあるかもなので注意。 vector中の各要素の数え上げ --------------------------- .. literalinclude:: cpp/count_elements/main.cpp 戻り値はstd::vector >でfirstに一致する要素がsecond個あることを表す。