57070


繰り返し処理の各処理におけるパフォーマンスをプログラムを書いています。  
繰り返し処理は、行列の足し算で各要素を足す処理を指しています。  
配列に入れた後、昇順にソートします。

以下のコードを組み合わせて、現在のプログラムを書きました。  
[繰り返し処理（行列の足し算）の参考コード](http://y-okamoto-
psy1949.la.coocan.jp/VCpp/IntroStat/median/)  
[中央値を求める参考コード](https://teratail.com/questions/202370)

**解決したいこと**  
現在のプログラムをコンパイルするとエラーが表示されるのですが、ソートするための修正方法がわかりません。

プログラムが何をしているかは理解して書いています。

C++に不慣れで、vectorがどんなメソッドや演算子を受け取れるか十分に理解できていないのと、  
エラー文「error: invalid operands to binary expression ('std::vector' and 'unsigned
long')」からバイナリ式に対する無効なオペランドだと思いますが、doubleをどのように変更すれば実現したいことができるのか検討がつかないです。

検索しても修正方法を理解できるサイトにたどり着くことができず、質問させていただきました。

[変数表示に関して参考にしたサイト](http://myoga.web.fc2.com/prog/cpp/intro05.html)  
[ソートに関して参考にしたサイト](http://stlalv.la.coocan.jp/sort.html)

コンパイルエラー

[code]

    $ g++ -o simple simple.cpp
    simple.cpp:62:40: error: invalid operands to binary expression ('std::vector<double>' and 'unsigned long')
        timedata = sort(timedata, timedata + sizeof(timedata));
                                  ~~~~~~~~ ^ ~~~~~~~~~~~~~~~~
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/chrono:1202:1: note: candidate template ignored: could not match 'duration'
          against 'vector'
    operator+(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/chrono:1501:1: note: candidate template ignored: could not match 'time_point'
          against 'vector'
    operator+(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
    ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/chrono:1512:1: note: candidate template ignored: could not match 'duration'
          against 'vector'
    operator+(const duration<_Rep1, _Period1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
    ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/iterator:761:1: note: candidate template ignored: could not match
          'reverse_iterator<type-parameter-0-0>' against 'unsigned long'
    operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_iterator<_Iter>& __x)
    ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/iterator:1202:1: note: candidate template ignored: could not match
          'move_iterator<type-parameter-0-0>' against 'unsigned long'
    operator+(typename move_iterator<_Iter>::difference_type __n, const move_iterator<_Iter>& __x)
    ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/iterator:1618:1: note: candidate template ignored: could not match
          '__wrap_iter<type-parameter-0-0>' against 'unsigned long'
    operator+(typename __wrap_iter<_Iter>::difference_type __n,
    ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/string:3993:1: note: candidate template ignored: could not match 'basic_string'
          against 'vector'
    operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
    ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/string:4006:1: note: candidate template ignored: could not match 'const _CharT *'
          against 'std::vector<double>'
    operator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs)
    ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/string:4018:1: note: candidate template ignored: could not match
          'basic_string<type-parameter-0-0, type-parameter-0-1, type-parameter-0-2>' against 'unsigned long'
    operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs)
    ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/string:4029:1: note: candidate template ignored: could not match 'basic_string'
          against 'vector'
    operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs)
    ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/string:4041:1: note: candidate template ignored: could not match 'basic_string'
          against 'vector'
    operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs)
    ^
    1 error generated.
    
[/code]

該当コード

[code]

    #include <chrono>
    #include <iostream>
    #include <thread>
    #include <vector>
    #include <algorithm>
    #include <iostream>
    
    //繰り返し処理全体にかかった時間
    using namespace std::chrono;
    
    
    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);
                }
        }
    
        //print
        //std::cout<<timedata<<std::endl;
    
        /*
        int hensu; 
    
        hensu=10; 
        std::cout<<hensu<<std::endl; 
        */
    
        //配列をソート
        timedata = sort(timedata, timedata + sizeof(timedata));
        for (int iIndex = 0; iIndex < sizeof(timedata); iIndex++) {
            std::cout << timedata[iIndex] << ", ";  // 結果をプリントしてみる。
        }
    
        /*
        #include <algorithm>
        #include <iostream>
        using namespace std;
    
        int main() {
        int aiTable[5] = { 3, 2, 6, -2, 2 };    // 配列を用意する。
        sort(aiTable, aiTable + 5);             // ソートする。
        {for (int iIndex = 0; iIndex < 5; iIndex++) {
            cout << aiTable[iIndex] << ", " ;   // 結果をプリントしてみる。
        }}
        return 0;
        }
        */
    
    }
    
[/code]


CC BY-SA 4.0
2019-07-31T09:27:23.673
57069
2019-07-31T10:19:02.737
2019-07-31T09:45:47.580
question
c++
C++で配列の要素をソートする時のエラー


参考にしたサイトでは `timedata` は `double` の配列であったと思います。  
提示されたコードでは `std::vector<double>` に変えてあるため、 二項演算が不正となってしまっています。  
`a + b` は、`b` が `unsigned long` で `a` が配列 (=ポインタ) の時は使えますが、`a` が `vector<T>`
の時は使えません。

`vector<T> hoge;` をソートしたい場合は

[code]

    std::sort(hoge.begin(), hoge.end());
    
[/code]

を使用してください。  
`hoge` の中身自体を変更するため (Pythonで言うと sortedではなくsortですね) 、再代入の必要はありません。


CC BY-SA 4.0
2019-07-31T10:19:02.737
57070
2019-07-31T10:19:02.737
20885
57069
answer