-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
C++版のリファクタリング/高速化 #4
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
丁寧な解説ありがとうございます!!!ほとんど別物になってしまいましたが、マトモなC++はこうあるべきという点、大変勉強になります。 |
一見すると変更量は多いのですが,実態としては殆どは |
Merged
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
C++がRustに負けたと聞いて
変更点
std::string_view
使いたかったのでusing namespace std;
ですが,これはADLによって想定と異なる関数が呼び出される危険性が非常に高く,「望んでADLさせたい場合」を除いて使うべきではないです(し,その場合も必要な関数だけusing
すれば良い).今回だと(最終的には別名関数stoi_unchecked
としましたが) 41b10e7 のように「標準ライブラリの関数と同名の関数」を定義した時に意図せずこれが発生する(例えば自分の実装したstoi
ではなくstd::stoi
が呼ばれてしまう)危険性があります(ADLの挙動を完全に理解していてそれでもusing namespace std;
したい,ということであればまぁご自由にしていただければと思います,完全理解者には敵わないので…).stoi
の呼び出しにstd::
付けてないのはミスです…#include<bits/stdc++.h>
ですが,これはlibstdc++の独自実装なので標準ライブラリを変更しにくくなります(移植性が悪い).今回は(libc++環境用意するのが面倒だったので)コンパイラのみの変更に留めましたが,今後libstdc++以外の標準ライブラリ(libc++やMSの実装など)を使いたくなった時にそのままではコンパイルが通らなくなります.この点では上述のGNU拡張の排除も同様の理由です(MSVCで確実にコンパイルが通らない)std::map
をstd::unordered_map
に変更std::getline
を使うように変更std::string_view
向けにstoi
を再実装 (stoi_unchecked
)int
型に収まる整数以外は来ないことを前提に実装してある(_unchecked
な)ので,ちゃんと整数かどうかを解析するstd::stoi
に比べて脆弱な実装ですが…stof100
関数の実装を高速化実行結果
以下の環境で1回ずつ走らせました.
Rust(8763034):
Rust(#6, 905642e):
C++(8763034):
C++(8b4338f):
Rustに勝ちました.
多分これが一番速いと思います