57081


繰り返し処理の各処理におけるパフォーマンスを配列に入れて、その中央値を求めるプログラムを書いています。繰り返し処理は、行列の足し算で各要素を足す処理を指しています。

[前回までの質問](https://ja.stackoverflow.com/questions/57071/c%E3%81%A7%E7%94%9F%E6%88%90%E3%81%97%E3%81%9F%E9%85%8D%E5%88%97%E8%A6%81%E7%B4%A0%E3%81%AE%E3%81%8C%E3%82%BD%E3%83%BC%E3%83%88%E3%81%A7%E3%81%8D%E3%81%9A-%E4%B8%AD%E8%BA%AB%E3%81%AE%E8%A6%81%E7%B4%A0%E6%95%B0%E3%81%8C%E4%B8%8D%E8%87%AA%E7%84%B6%E3%81%AA%E5%95%8F%E9%A1%8C%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)に続いて、こちらの質問をします。

**解決したいこと**  
中央値を求める部分で関数呼び出し後の型に関するエラーを解決したい

**コンパイルエラー（errorのみ抜粋、warningは除く）**  
下二つのエラーは１つ目のエラーに起因すると考えています。  
１つ目は型に関してのエラーであることは推測できるのですが、中央値を求めるmedian()関数を呼び出す前の型doubleと合わせて、どのようにコードを修正すればいいかわかりません。

[code]

    $ g++ -o sample_med sample_median.cpp
    sample_median.cpp:25:14: error: invalid operands to binary expression
          ('double' and 'int')
        if (size % 2 == 1) {
            ~~~~ ^ ~
    
    sample_median.cpp:83:5: error: use of undeclared identifier 'ans'
        ans = median(timedata);
        ^
    sample_median.cpp:84:18: error: use of undeclared identifier 'ans'; did you mean
          'abs'?
        std::cout << ans << std::endl;
                     ^~~
                     abs
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/stdlib.h:113:44: note: 
          'abs' declared here
    inline _LIBCPP_INLINE_VISIBILITY long long abs(long long __x) _NOEXCEPT ...
    
    
[/code]

現行のコード

[code]

    #include <chrono>
    #include <iostream>
    #include <thread>
    #include <vector>
    #include <algorithm>
    #include <iostream>
    
    //繰り返し処理全体にかかった時間
    using namespace std::chrono;
    
    double median(std::vector<double>v) {
        double size = v.size();
        std::vector<double> _v(v.size());
        copy(v.begin(), v.end(), back_inserter(_v));
        double tmp;
        for (int i = 0; i < size - 1; i++){
            for (int j = i + 1; j < size; j++) {
                if (_v[i] > _v[j]){
                    tmp = _v[i];
                    _v[i] = _v[j];
                    _v[j] = tmp;
                }
            }
        }
        if (size % 2 == 1) {
            return _v[(size - 1) / 2];
        } else {
            return (_v[(size / 2) - 1] + _v[size / 2]) / 2;
        }
    }
    
    int main()
    {
        #define N 2
    
        double A[N][N] = {
            {3.0, 5.0},
            {9.0, 5.0}
        };
    
        double B[N][N] = {
            {3.0, 6.0},
            {8.0, 9.0}
        };
    
        double C[N][N] = {
            {0.0, 0.0},
            {0.0, 0.0}
        };
        int i, j, k, n;
    
    
    
        //各足し算にかかった時間を入れる配列
        std::vector<double> timedata;
    
        for(i=0; i<N; i++){
            for(j=0; j<N; j++){
                    //測定開始
                    std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now();
                    C[i][j] += A[i][j]+B[i][j];
                    //測定終了
                    high_resolution_clock::time_point end = high_resolution_clock::now();
                    double time =  std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
    
                    //配列にappend
                    timedata.push_back(time);
                }
        }
    
        //ソート前
        for (auto value : timedata) {std::cout << value << ", ";
            std::cout << std::endl;
        }
    
        //配列をソート
        std::cout << "After Sorted"<< std::endl;
        std::sort(timedata.begin(), timedata.end());
        for (auto value : timedata) {std::cout << value << ", ";
            std::cout << std::endl;
        }
    
        ans = median(timedata);
        std::cout << ans << std::endl;
    
    }
    
[/code]


CC BY-SA 4.0
2019-07-31T13:39:20.310
57080
2019-07-31T13:58:20.273
question
c++ アルゴリズム
C++でソートした配列から中央値を求める時のエラー


まず最初のエラーについて

>
[code]

>     sample_median.cpp:25:14: error: invalid operands to binary expression
>           ('double' and 'int')
>         if (size % 2 == 1) {
>             ~~~~ ^ ~
>  
[/code]

これは関数`median(std::vector<double>v)`内の変数、`size`の型の問題です。

[code]

    double median(std::vector<double>v) {
        double size = v.size();
    
[/code]

と、`size`を`double`で定義していますが、`double`型の値に`%`演算子は使えないというのがエラーの意味です。`size`の使われ方を見ると、個数やインデックスとしてのみ用いられており、`double`にしなければならない理由が全くありません。ここは

[code]

    double median(std::vector<double>v) {
        size_t size = v.size();
    
[/code]

とすべきです。

* * *

次に

>
[code]

>     sample_median.cpp:84:18: error: use of undeclared identifier 'ans'; did
> you mean
>           'abs'?
>         std::cout << ans << std::endl;
>  
[/code]

について。

これは、単純に`ans`変数が定義されていないから出ているエラーです。`main()`の最後の方で

[code]

        double ans = median(timedata); // ここでansを定義
        std::cout << ans << std::endl;
    
    }
    
[/code]

と定義しましょう。


CC BY-SA 4.0
2019-07-31T13:58:20.273
57081
2019-07-31T13:58:20.273
3605
57080
answer