複数のパラメータのGCD

user9267359

私の目的は、C ++の__gcd()std<algorithm>ヘッダーで利用可能なものを一般化することでしたこれは、std::vector配列の値の範囲を呼び出すことができるはずです。

一般化されたテンプレート__gcd()は、パラメーターが直接渡された場合に完全に機能します。以下のように:

math::GCD(1,2,58,54);

ただし、ベクトルの値の範囲を渡そうとすると(コードは以下に示されています)、次のエラーが表示されます。

D:\Programming\C++\CPP Programs\My Test\My Test.cpp|33|error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and '__gnu_cxx::__normal_iterator<int*, std::vector<int> >')|

operator<<このテンプレート/プログラムにオーバーロードまたはオーバーロード関数を含める方法がわかりません(エラーの原因がオーバーロードであると想定していますoperator<<

namespace math
{

    template <typename M, typename N>
    constexpr auto GCD(const M& m, const N& n) {
        return __gcd(m, n);
    }

    template <typename M, typename ...Rest>
    constexpr auto GCD(const M& first, const Rest&... rest) {
        return __gcd(first, GCD(rest...));
    }
}

int main()
{
    vector<int> vec={1,2,58,54,102,2,37,13,8};
    for(auto i=0; i<vec.size()-3; ++i)
        cout<<math::GCD(vec.begin()+i, vec.begin()+i+4)<<endl;
    return 0;
}

誰かが私が過負荷になるのを手伝ってくれますoperator<<か、または(そうでない場合は)エラーを見つけるのを手伝ってくれますか?前もって感謝します。

user9267359

いよいよやった。@Incomputableの最後のコメントをありがとう。ただし、新しいテンプレート(イテレータ用)と、math名前を使用して質問で使用した2つのテンプレートを区別する必要がありました次のように:

#include <iostream>
#include <vector>

template<typename T64> constexpr  T64 calcGCD(T64 a, T64 b)
{
    return (a==0 && b!=0) ? b: a;
    while(b)
    {
        T64 t = a % b;
        b = a;
        a = t;
    }
    return a;
}

template <typename Iterator> constexpr auto GCD(Iterator first, Iterator last)
{
    auto itrFirst = first;
    auto itrEnd   = last;
    int Size      = std::distance(itrFirst,itrEnd);
    int Result = 0;

    if(Size >=2 )
    {
        int A       = *itrFirst;
        std::advance (itrFirst,1);
        int B       = *itrFirst;

        Result      = calcGCD(A,B);
        std::advance (itrFirst,1);

        for(int i = 2; i<Size; ++i)
        {
            A       = *itrFirst;
            Result  = calcGCD(Result,A);
            std::advance (itrFirst,1);
        }
    }
    else   return *itrFirst;
    return Result;
}

namespace math
{
    template <typename M, typename N>
    constexpr auto GCD(const M& m, const N& n)
    { return calcGCD(m, n); }

    template <typename M, typename ...Rest>
    constexpr auto GCD(const M& first, const Rest&... rest)
    { return calcGCD(first, GCD(rest...));  }
}


int main()
{
    std::vector<int> vec={1,2,58,54,102,2,37,13,8};

    std::cout<<"GCD from Iterator Template     : ";
    for(unsigned int i=0; i<vec.size()-3; ++i)
      std::cout<<GCD(vec.begin()+i, vec.begin()+i+4)<<" ";

    std::cout<<std::endl;

    std::cout<<"GCD from non-iterator Templates: ";
    std::cout<<math::GCD(1,2,58,54)<<" ";
    std::cout<<math::GCD(2,58,54,102)<<" ";
    std::cout<<math::GCD(58,54,102,2)<<" ";
    std::cout<<math::GCD(54,102,2,37)<<" ";
    std::cout<<math::GCD(102,2,37,13)<<" ";
    std::cout<<math::GCD(2,37,13,8)<<" ";   

    return 0;
}

期待どおりに必要な出力が得られます。ただし、他のケースについてはテストしていません。

出力:

GCD from Iterator Template     : 1 2 58 54 102 2 
GCD from non-iterator Templates: 1 2 58 54 102 2 

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

複数の関数パラメータ?

分類Dev

.htaccessURLの複数のパラメータ

分類Dev

複数のパラメータの使用

分類Dev

AND複数のパラメータ

分類Dev

複数のパラメータ値

分類Dev

Reactルーターの複数のパラメーター

分類Dev

Playの複数のパスパラメータのPathBindable

分類Dev

「New-Item」の「-name」パラメータの複数の変数

分類Dev

複数のパラメータURLパターンdjango2.0

分類Dev

関数の複数のパラメーター

分類Dev

複数の回帰パラメーターのStatsmodelsOLS関数

分類Dev

関数Pythonの複数のパラメーター定義

分類Dev

複数の変数のパラメーター展開

分類Dev

複数のパラメータとパラメータリストの準引用

分類Dev

型クラスの複数の型パラメーター?

分類Dev

WordPressAJAXの複数のデータパラメータ

分類Dev

SwaggerEditorのボディ内の複数のパラメーター

分類Dev

sklearnの検証曲線の複数のパラメーター

分類Dev

複数のパラメータパック-どのように?

分類Dev

パラメータとしての複数のLinq関数

分類Dev

複数のGCD

分類Dev

複数のパラメーターのグローバル平均

分類Dev

C ++ 17複数パラメーターパックの拡張

分類Dev

複数のelementIDパラメーターHTMLDOM getElementById()メソッド?

分類Dev

Seaborn violinplotのHUEパラメータの複数の列

分類Dev

ValidateSetのPowershell複数関数パラメーター

分類Dev

SQL関数に複数のパラメーターを渡す

分類Dev

リスト内の複数のパラメーター

分類Dev

React Routerでの複数のパラメーター

Related 関連記事

ホットタグ

アーカイブ