c++で文字と数字の変換(char-string-int)

競プロのb問題とかといていて、よく忘れるため、自分用のメモ

■数字→文字(int→string)

string s = to_string(int n);

ちなみにto_stringではMinGW系(clangdで利用する場合も含む)32bitのものだとバグがあり使えない。
対応することも可能だけれど、このご時世64bitを利用しておきましょう。

■文字→数字(string→int)

int n = stoi("2223");

ベストプラクティスを知らないが、大体必要な時はこれで対処している。

■文字→数字(cahr→int)

char a = '1';
int n = a - '0';

非常によく使う。string型を配列のように使って1文字取り出す場合も、
char型として扱われるため、頻出。ググるとatoiでやれと言われるが環境によっては使えなかったりしていつも苦労してた。
charは文字のまま使うとa-zなども含めて何番目にある文字か?といったintとしてつかわれるため、0-9に並んでいるので頭の0の番号を引くと、0-9に変換できる。

競プロテンプレートファイルメモ

ヘッダーにいろいろ書いて楽々コーディング
必要に応じて増やすけど、現在はこんな感じです。

#include<iostream>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<string>
#include<cstring>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<bitset>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;

#define mod 1000000007LL
#define eps 0.0001
#define pi acos(-1)
#define INF 10000000000000000

#define rep(i, n) for(i = 0;i < n;++i)
#define rep1(i, n) for(i = 1;i < n;++i)
#define pri(x) cout << (x) << "\n"
#define pri2(x, y) cout << (x) << " " << (y) << "\n"
#define pri3(x, y, z) cout << (x) << " " << (y) << " " << (z) << "\n"

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    // ---------------------
    // コーディング開始
    // ---------------------
    string n;
    cin >> n;

    return 0;
}

vim-lspが重かったのを解消した話

競技プログラミングに参加するにあたって、vim-lspを導入したんですけど、
デスクトップでは軽いのにノートPCだとなんか重く、タイピング本気でやると応答がなくなる始末でした。
clangdの動作が重いのかなーとかそんなこと考えて調べてました。
でも一応ノートPCもCPUi5だし、インクルードファイルの内容によってはHDD性能とかが足引っ張る事例も見かけはするものの、SSD・・・

エラーチェックオフにするといいよーと言われ、オフにしても変わらず。

色々切り分けてみると単純なことで解決しまいした。

重かった原因はこいつ↓
let g:lsp_log_file = expand(‘~/vim-lsp.log’)
let g:lsp_log_verbose = 1

lspでなにかするとログを残してくれるデバッグオプション。
そりゃがりがりioしてたら遅いよね、と。

私の環境だと何故か
let g:lsp_log_verbose = 0
にしてもログがはかれていました。
g:lsp_log_file も指定しないとエラーはいてしまうようなので、
let g:lsp_log_file = “”
“let g:lsp_log_verbose = 1
とすることで解決。

ノートPCでも爆速動作するようになりました。

■雑談
エラーチェックで段がずれる問題ですけど、aleだとエラー出す列を出しっぱなしにするオプションがあるらしい。
kaoriya番は2019/8/25の最新バージョンでは対応していないけれど、最新のVimではエラー表示をnumber列にだすようにかえるオプションがあるので、
kaoriya版が更新されたら設定いじってみるつもり

C++の補完環境をclangd+LSPで導入しようとしたらめちゃくちゃ苦労した話

LSP環境構築にあまり慣れていないくせに使ったことのない言語で

■調べてつまずいたポイント
Windowsでclangdの導入方法がどこにも書いてない(clangの導入方法ばっか出てくる)
LSPから通知されるiostream file not found いやいやいや、g++は通るから!
compile_flags.txtの配置場所
ランゲージサーバー側のエラーログの確認方法
そもそもWindowsでやってる人すくない

■最終的に
補完が思ったように動作するようになりました。
環境設定の問題か、PCスペックの問題か、OSの問題かわからないけれど、
ネットで見るほどエラーチェック早くないけど、とりえず動けばよい!(わかる人に教わりたい)

■手順(本題)
私の最終的に設定した方法と参考にしたサイトを紹介していきます。

前提として、コンパイラはMinGWを利用します。
※WSLでg++流すとかイケイケなことしたかったけど、様々な課題があり、断念。

【1】まずランゲージサーバーの導入を行います。
・LLVM Clang の Windows へのインストールと使い方
http://yohshiy.blog.fc2.com/blog-entry-294.html
・MinGW(gcc) の Windows へのインストールと使い方
http://yohshiy.blog.fc2.com/blog-entry-292.html

【補足とか】
LLVMをインストールすれば、clangdはインストールされます。clangも。
MinGWはインストールパスを変えないようにしましょう的なこと書いてあるけど、そもそもclangdはmingwみてくれてないので関係なかったです。
パスは通す設定にしましょう。
僕は以下みたいなパスが通ってる状態です。
C:\MinGW\bin
あと32bit版mingw入れていたらto_string使えない問題が勃発して結局64bit版に乗り換えた。

【2】VIM側のLSPの導入をします。
ここは別記事でいずれ紹介するため、割愛。
主に以下のサイトを参考にしました。

・vim8,neovimで補完使うならdeopleteよりvim-lsp使おうぜ

さて、ここまでやってうまく動かないはずです。
※少なくとも僕は動きませんでした。
慌てずに解決策を以下に記載します。

【3】うまく認識されない問題の洗い出し(解決策を知りたい方は4まで飛ばしてよいです。)
試しにhelloworldプログラムを書こうとすると、includeにエラーが・・・
原因を探す手順をいくつか紹介します。

1. VIMで表示されたエラーの内容を確認する
vimrcに以下のグローバル変数を追加
let g:lsp_diagnostics_echo_cursor = 1
これを行うことで、vim内でエラー行にカーソルを合わせたときになぜエラーとなったか表示されます

2. iostream file not found
g++を利用したQuickRunは通るのになぜかファイルがねーよといわれる。
これは利用するコンパイラからファイルが見えていないため。
以下のブログを参考にしたけど、いまいちわからず、

・ClangdでC++ソースコードを補完する際にコンパイルオプションを指定する方法

執筆者の方に連絡して、アドバイス頂きました。(本当に助かりました。)
今回のファイルがみつからない問題と違うと判断(結果的にはこのブログ記載の手順を使うことになります。)

3. ではコマンドプロンプトから直接やったらどうか?
コマンドプロンプトで以下をたたく
g++ [ファイル名] → 通る
clang++ [ファイル名] →  iostream file not foundがでる。これだ!
※そもそもコマンドたたけないならパスが通ってないか、インストールしてないです。
※clang++ でのコンパイルが通ればclangdのエラーチェックにも引っかからなくなる。

clang++ -v [ファイル名] で再度実行すると、includeファイルをどこに探しにいっているかみれる。
私の場合、visualstudioのフォルダを探しにいっていて、そもそもVSはいれていないため、見つからなかったようだ。

4. clang++ でコンパイルを通すには・・・・?
同じ問題で悩んでいる方が。

・clangのエラーに困っています。
https://teratail.com/questions/164495
→ ここでの記載があるように、コンパイルオプションをつけると成功する

clang++ –target=i686–target=i686-pc-windows-gnu [ファイル名] →成功!!!
コンパイルオプションをつけることで、通った。

【4】結果成功した手順
compile_flags.txt に以下を記載

–target=i686–target=i686-pc-windows-gnu
※ちなみにwingw64bit版だとオプションの設定が違います。自分の環境でg++ -v してでてきたTargetの項目を–target=の後ろに書いてあげてください。

compile_flags.txt をソースファイルと同階層に配置

することで、解決しました。(includeでエラー表示がなくなった!)
もっと軽快に動いてくれればなーとは思いますけど、動かすまでに2日くらいかかってるので、しばらくはこれでいいかな。

lspの設定何できるかしらべよー。

競技プログラミング環境整備メモ

競技プログラミングを始めるにあたって、いろいろ設定を行ったのでメモ

■言語
JAVAGold取ったし、Rubyやりたいし、最近Python書いてるからどれかかなーと思ったけど、
自分の得手不得手を無視すれば、C++がほぼ一択で時点でJAVAらしい

■エディタ環境
いつものごとくVim

■プラグイン回り
QuickRun回りは下記を参考にした
https://wann.tokyo/notes/quickrun-for-cpp/

■コンパイラ
WSLを利用して入れたかったけれど、QuickRun側の修正か仲介プログラム必要そうだったので、以下を利用できず
https://qiita.com/AokabiC/items/e9312856f588dd9303ed
MinGWを使うことにしました。
https://gist.github.com/n-ari/6da3a8f03fff09b449130b01aa8b7e4d

■補完
LSPを入れた、Windows環境でclangdを入れる方法がわからなさすぎたが、LLVMのWindowsインストーラーでpathをいれてくれた。
・LLVM入れ先
http://releases.llvm.org/download.html
・LSPの設定参考
https://qiita.com/Quramy/items/bccf7b19919679541484

今日のところはここまで。追記していきます。