読者です 読者をやめる 読者になる 読者になる

Accelerated C++ 第3章

vector

Cの配列よりは使いやすいコンテナクラス。
サイズに拡張に伴うメモリ割付などを面倒みてくれるが、組み込み機器で使うのはどうなんだろうか。実メモリシステムだとフラグメンテーションが怖い。(といいつつまだ遭遇したことはないわけだけど)

3.2.3 追加コメント

結局、homework.size() が0のとき、midも0になってhomework[mid - 1]のmid-1が符号なしの大きな数になることを言いたいんだろけど、ちょっと回りくどい。

課題

3-0

やってみた。

3-1

メジアンの計算は、全データ入力後にソートし、順番として中央のデータを取り出すことになる。
よって既に読み込んだデータが保存されていないと、そもそもソートができない。

3-2

こんな感じ。

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    // データ読み込み
    std::vector<int>    v;
    int     data;
    while (std::cin >> data) {
        v.push_back(data);
    }
    // ソート
    std::sort(v.begin(), v.end());
    // 数のチェック
    if (v.size() < 4) {
        std::cout << "データ数が" << v.size() << "のため、クオータイルを求められない" << std::endl;
        return 1;
    }
    std::vector<int>::size_type size = v.size() / 4;

    int index = v.size() - 1;
    for (int i = 0; i < 4; ++i) {
        std::cout << std::endl << "group: ";
        for (int j = 0; j < size; ++j) {
            std::cout << " " << v[index--];
        }
    }
    while (index >= 0) {
        std::cout << " " << v[index--];
    }
    std::cout << std::endl;
        
    return 0;
}

降順にソートする方が自然だと思うけど、それには greater() をsort()の第3引数に指定するみたい。

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>	// greater<int>に必要

int main()
{
    // データ読み込み
    std::vector<int>    v;
    int     data;
    while (std::cin >> data) {
        v.push_back(data);
    }
    // ソート
    std::sort(v.begin(), v.end(), std::greater<int>());
    // 数のチェック
    if (v.size() < 4) {
        std::cout << "データ数が" << v.size() << "のため、クオータイルを求められない" << std::endl;
        return 1;
    }
    std::vector<int>::size_type size = v.size() / 4;

    int index = 0;
    for (int i = 0; i < 4; ++i) {
        std::cout << std::endl << "group: ";
        for (int j = 0; j < size; ++j) {
            std::cout << " " << v[index++];
        }
    }
    while (index < v.size()) {
        std::cout << " " << v[index++];
    }
    std::cout << std::endl;
        
    return 0;
}

あとは明日。。