ためすう

accumulate を使ってみる (C++)

2019-12-08

やったこと

合計を計算するため、accumulate を使ってみます。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

int main() {
    // 配列
    int A[] = {1, 3, 5};
    cout << accumulate(A, A + 3, 0) << endl;
    cout << accumulate(A, A + 3, -2) << endl;

    // ベクター
    vector<int> B = {2, 4, 8};
    cout << accumulate(B.begin(), B.end(), 0) << endl;
    cout << accumulate(B.begin(), B.end(), -3) << endl;
}

出力結果

9
7
14
11

参考

sprintf での文字列の表示 (C++)

2019-12-08

やったこと

文字列を sprintf で表示する方法について、いくつか試してみます。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

#include <bits/stdc++.h>
using namespace std;

int main() {
    char s[] = "abcde";
    string s2 = "xyzab";
    char c1 = s[1];


    printf("s: %s\n", s);
    // char に変換する必要がある
    printf("s2: %s\n", s2.c_str());
    printf("c1: %c\n", c1);
}

出力結果

s: abcde
s2: xyzab
c1: b

ceil, floor, round を使ってみる (C++)

2019-12-08

やったこと

下記の関数を使ってみます。

  • ceil
  • floor
  • round

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    cout << "ceil" << endl;
    cout << ceil(5.4) << endl;
    cout << ceil(5.9) << endl;

    cout << "floor" << endl;
    cout << floor(5.4) << endl;
    cout << floor(5.9) << endl;

    cout << "round" << endl;
    cout << round(5.4) << endl;
    cout << round(5.9) << endl;
}

出力結果

ceil
6
6
floor
5
5
round
5
6

参考

整数値の最大値、最小値 (C++)

2019-12-07

やったこと

整数の最大値と最小値について確認してみます。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    printf("short int: %d ~ %d\n", SHRT_MIN, SHRT_MAX);
    printf("unsigned short int: 0 ~ %d\n", USHRT_MAX);
    printf("int: %d ~ %d\n", INT_MIN, INT_MAX);
    printf("unsigned int: 0 ~ %u\n", UINT_MAX);
    printf("long int: %ld ~ %ld\n", LONG_MIN, LONG_MAX);
    printf("unsigned long int: 0 ~ %lu\n", ULONG_MAX);
    printf("long long: %lld ~ %lld\n", LLONG_MIN, LLONG_MAX);
    printf("unsigned long long: 0 ~ %llu\n", ULLONG_MAX);
}

出力結果

short int: -32768 ~ 32767
unsigned short int: 0 ~ 65535
int: -2147483648 ~ 2147483647
unsigned int: 0 ~ 4294967295
long int: -9223372036854775808 ~ 9223372036854775807
unsigned long int: 0 ~ 18446744073709551615
long long: -9223372036854775808 ~ 9223372036854775807
unsigned long long: 0 ~ 18446744073709551615

typedef を使ってみる (C++)

2019-12-07

やったこと

typedef を使ってみます。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

typedef 名は既存の型の別名であり、新しい型の宣言ではありません。

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    cout << INT_MAX << endl;
    cout << LONG_MAX << endl;

    typedef long long ll;
    ll a = 10000000000;
    cout << a << endl;
}

出力結果

2147483647
9223372036854775807
10000000000

参考

class を使ってみる (C++)

2019-12-01

やったこと

class を使ってみます。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
using namespace std;

class Sample {

public:
    void init(int n) {
        printf("called init %d\n", n);
    }

    void up() {
        printf("called up\n");
    }
};

int main() {
    Sample s1;
    s1.init(100);
    s1.up();
}

出力結果

called init 100
called up

struct を使ってみる (C++)

2019-12-01

やったこと

データの構造体を定義するため struct を使ってみます。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
using namespace std;

struct person { string name; int age; };

int main() {
    person p = {"person name", 20};

    cout << p.age << endl;
    cout << p.name << endl;
}

出力結果

20
person name

next_permutation を使ってみる (C++)

2019-11-24

やったこと

順列を使うため、

  • next_permutation

を使ってみます。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    // ソート済みであること
    vector<int> v = {1, 2, 15};

    do {
        for (int i = 0; i < v.size(); i++) {
            printf("%d ", v[i]);
        }
        printf("\n");
    } while (next_permutation(v.begin(), v.end()));
}

出力結果

1 2 15
1 15 2
2 1 15
2 15 1
15 1 2
15 2 1

参考

type_info を使ってみる (C++)

2019-11-24

やったこと

データ型を確認するために

  • type_info

を使ってみます。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    int a1;
    long int a2;
    string a3;
    char a4;
    vector<int> a5;

    cout << typeid(a1).name() << endl;
    cout << typeid(a2).name() << endl;
    cout << typeid(a3).name() << endl;
    cout << typeid(a4).name() << endl;
    cout << typeid(a5).name() << endl;
}

出力結果

i
l
NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
c
St6vectorIiSaIiEE

参考

第2回 大規模Webサービスの開発オリエンテーション (大規模サービス技術入門)

2019-11-24

Web開発者のための大規模サービス技術入門の読書メモです。

大規模データの難しさ

第一のポイント「メモリ内で計算できない」という点

メモリはディスクの10^5 ~ 10^6以上高速

hdparm 転送速度の差が分かる

ボトルネック見極め作業の基本的な流れ

  • ロードアベレージを見る
  • CPU、I/Oのいずれかがボトルネックかを探る

ロードアベレージを見る

システム全体の負荷状況を示す指標

CPU、I/Oのいずれかがボトルネックかを探る

sar, vmstat で時間経過とともにCPU使用率やI/O待ち率の推移が確認できる

大規模環境では、I/O負荷を抱えるサーバはそもそも分散させるのが難しい上に、ディスクI/Oが多発するとサーバが簡単に遅くなってしまうという本質的な問題がある

大規模データを扱うために

  • いかにしてメモリで済ませるか
  • データ量の増加に強いアルゴリズム、データ構造
  • データ圧縮、情報検索技術

参考

  • [Web開発者のための大規模サービス技術入門]