nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

独自クラスをstd::vectorに格納する

std::vector に独自クラスを入れる場合、デフォルトコンストラクタとコピーコンストラクタが必要不可欠みたいです。

d.hatena.ne.jp

コピーコンストラクタについては、このページに詳しく書かれています。 http://nobunaga.hatenablog.jp/entry/2016/07/03/230337

以下にサンプルコードを記載します。

#include <iostream>
#include <vector>

class Foo {
public:
    int i;
    Foo() : i(0) {
        std::cout << "default" << std::endl;
    }
    Foo(int num) : i(num) {
        std::cout << "int param" << std::endl;
    }
    Foo(const Foo &rhs) : i(rhs.i) {
        std::cout << "copy const" << std::endl;
    }
    ~Foo() {
        std::cout << "destructer" << std::endl;
    }
};

int main(int argc, char *argv[]) {
    std::vector<Foo> v;
    v.push_back(Foo(1));
    v.resize(2);
    return 0;
}
#include <iostream>
#include <string.h>
#include <vector>       // ヘッダファイルインクルード
using namespace std;

// n r   #箱の数n, ボールの半径r 表す整数
// h_1 w_1 d_1   #1個目の箱の高さ、幅、奥行きを表す整数
// h_2 w_2 d_2   #2個目の箱の高さ、幅、奥行きを表す整数
// ...
//h_n w_n d_n   #n個目の箱の高さ、幅、奥行きを表す整数


class Ball {
    
    int height;
    int width;
    int depth;
    
public:
    Ball();
    
    Ball(int h, int w, int d){
        height = h;
        width = w;
        depth = d;
    }
    
    int getHeight(){return height;}
    int getWidth(){return width;}
    int getDepth(){return depth;}
    
    // コピーコンストラクタ
    Ball (const Ball& rhs) : height(rhs.height), width(rhs.width), depth(rhs.depth){
        
    }
};

int main() {
    
    // パラメータ取得取得処理
    char str[100];
    char *pcError = NULL;
    
    // 1行目のデータ取得処理
    if (fgets(str, sizeof(str), stdin) == NULL) {
        return 0;
    }
    
    char delim[]=" \t\r\n\v\f"; 
        
    // strtok関数の初回の呼び出しは、第一引数に、分解対象の文字列を指定すること
    int numItem = strtol(strtok(str, delim), &pcError, 10);
    if (*pcError != '\0') {
        printf("strtoul() error: %s\n", str);
        return 0;
    }
    
    // strtok関数の2回目以降の呼び出しは、第一引数に、NULLを指定すること
    const int radiusBall = strtol(strtok(NULL, delim), &pcError, 10);
    if (*pcError != '\0') {
        printf("strtoul() error: %s\n", str);
        return 0;
    }
    printf("numItem = %d, raidusBall = %d\r\n", numItem, radiusBall);
    
    std::vector<Ball> v;
    
    // 2行目以降のデータ取得処理
    for(int i = 0; i < numItem; i++) {   
        // 1行分文字列を読み出す
        if (fgets(str, sizeof(str), stdin) == NULL) {
            break;
        }
        // strtok関数の初回の呼び出しは、第一引数に、分解対象の文字列を指定すること
        const int height = strtol(strtok(str, delim), &pcError, 10);
        if (*pcError != '\0') {
            printf("strtoul() error: %s\n", str);
            return 0;
        }
        // strtok関数の2回目以降の呼び出しは、第一引数に、NULLを指定すること
        const int radius = strtol(strtok(NULL, delim), &pcError, 10);
        if (*pcError != '\0') {
            printf("strtoul() error: %s\n", str);
            return 0;
        }
        // strtok関数の3回目以降の呼び出しは、第一引数に、NULLを指定すること
        const int depth = strtol(strtok(NULL, delim), &pcError, 10);
        if (*pcError != '\0') {
            printf("strtoul() error: %s\n", str);
            return 0;
        }
        v.push_back(Ball(height, radius, depth));
    }
    
    int count = 0;
    for (Ball x: v) {
        count++;
        if(x.getHeight() >= radiusBall && x.getWidth() >= radiusBall && x.getDepth() >= radiusBall) {
               cout << count << endl;
        }
    }
}