[Algorithm]0 x 02基本コード作成テクニック2


ソース:https://blog.encrypted.gg/923?category=773649
  • 本プロトコルは、上記のリンクに基づく文章であり、個人学習に用いられる.
  • ▼STLと関数因子
    関数パラメータ

  • ポインタではなく通常のタイプを関数パラメータとして送信する場合は、このタイプをコピーしてスキップし、関数外部の値は変更されません.

  • 配列をパラメータとして使用すると、配列のアドレスがスキップされるため、関数で配列要素の値を変更できます.

  • リファレンス
    void swap1(int a, int b) {
    	int tmp = a;
    	a = b;
    	b = tmp;
    } // X
    
    void swap2(int *a, int *b) {
    	int tmp = *a;
    	*a = *b;
    	*b = tmp;
    } // O
    
    void swap3(int &a, int &b) {
    	int tmp = a;
    	a = b;
    	b = tmp;
    } // O
    C言語などのレプリケーション変数は値を変更することができず、swap2のようにポインタを送信して値を変更することができます.
    C++にはもう一つの解決策があり、参考者を使用しています.swap3では、パラメータの前に&が表示され、これを使用すると、aおよびbが参照となる.
    aとbを参照として作成すると、関数のコードでは、代入されているように見えます.
    これは原本の住所を受け取り、原本の行為を変更することです.
  • STL(Standard Template Library) - vector
  • vectorは可変配列であり、大きさを任意に増減することができる.
  • vectorvectorヘッダで発表された.
  • STLを関数パラメータに渡す場合
    void func1(vector<int> v) {
    	v[10] = 7; // vector을 쌩으로 함수 인자로 넣으면 복사해서 보낸다.
    }
    
    int main() {
    	vector<int> v(100); // int형이고 0으로 초기화된 100칸짜리 가변배열 v 선언
    	func1(v); // v가 복사되어서 들어가기 때문에 func1 외부 값은 변경되지 않는다.
    }
    bool cmp1(vector<int> v1, vector<int> v2, int idx) {
    	return v1[idx] > v2[idx];
    }
    // 위 함수는 v1과 v2를 모두 복사해야 하기 때문에, 의도한 바와 달리 O(N)의 시간복잡도를 가진다.
    
    bool cmp2(vector<int> &v1, vector<int> &v2, int idx) {
    	return v1[idx] > v2[idx];
    }
    // 참조자를 사용하면, 참조 대상의 주소 정보만 넘어오기 때문에,
    // 시간복잡도는 의도한 대로 O(1)이 된다.
  • ▼▼標準I/O
    scanf/printfおよびcin/cout
    CはI/Oをscanf / printfで処理し、C++はcin / coutで処理する.
    機能に違いはありませんが、どれを使っても大丈夫です.
  • 週のポイント-スペースを含む文字列は入力しにくい.△二人とも空白のところで入力を受けている.ソリューション-getline.(他に方法はありますが、これが一番清潔です)
  • cin/coutを使用する際の注意事項

  • I/Oタイムアウトを防止するには、ios::sync_with_stdio(0)cin.tie(0)の2つのコマンドが必要です.
    (そうしないと、I/O量が大きいとタイムアウトになる可能性があります.)
    (以下の内容を理解して使用しなくても構いません.)
  • ios::sync_with_stdio(0) scanf / printfで使用されるCストリームは、cin / coutで使用されるC++ストリームから分離される.
    基本的に、プログラムの2つのストリームは同期されています.
    ただし、C++ストリームのみを使用する場合は、両方のストリームを同期する必要はありません.
    上記のコマンドで同期を中断します.
    (同期が無効な場合は、printf / scanfは使用できません.)ios::sync_with_stdio(false) == ios::sync_with_stdio(0)
  • cin.tie(0)I/Oはバッファを使用し、出力を例にとります.
    出力はコンソールに直接出力するのではなく、バッファに入れて出力します.
    問題を解決する場合、入力と出力が交互に表示され、画面に表示されると、バッファの存在によって順序が一致しない可能性があります.
    デフォルトでは、cinコマンドが発行される前にcoutバッファを空にして、このような状況を回避します.
    エンコードテストでは、入力文字と出力文字の順序が一致しなくても、スコアに影響しません.
    したがって、cinを実行する前に、coutをクリアする必要がないので、より高速に動作する.cin.tie(nullptr) == cin.tie(0)
  • endlendlは使わないでください.
    絶対絶対絶対絶対絶対使わないでendlコマンドは、文字出力を開いた後に出力バッファを空にしますが、coteはバッファを空にする必要はありません.endlの代わりに、開行文字(\n)を使用します.
    💁 コードヒントの作成
    符号化テストと開発は異なる.
    長期にわたって実際の開発に従事している人は、コードを非常に精巧に書くことがあります.
    しかし、コードテストは私が混同しない範囲で、どうしてもタイプを節約しなければなりません.
    💡 コードテストの目標は、他人が理解できるコードを書くことではありません.
    どうしても限られた時間内に正解を得なければならない.
    だから、努力してきれいにするより、少し汚くても
    私が迅速に編成できる方法で迅速に実現することが重要です.
    出力の最後にスペースまたは改行を追加します.
    あってもいいし、なくてもいいので、特別な処理は必要ありません.
    デバッガは必ずしも使用する必要はありません.
    答えが正しくない場合は、デバッガを使用することがあります.
    エンコードテストのコードは100行程度になるはずです.
    問題がある場合は、デバッガを開けるとさらに泥沼に陥る感じがします.
    中間変数も見たい場合は、デバッガを使用しないで出力を中間で表示することをお勧めします.