1

関数から複数の値を返すことができるかどうかに興味があります。たとえば、拡張ユークリッド アルゴリズムなどの関数を考えてみましょう。基本的なステップは、この Input is 非負の整数 a および b によって記述されます。出力は、 のようなトリプレット (d、i、j) ですd=gcd(a,b)=i*a+j*b。私の質問の目標を明確にするために、短い再帰コードを書きます。

 if (b==0)  return (a,1,0)
      q=a mod b;

r を次のようにします。 a=r*b+q;

(d,k,l)=extendedeuclidean(b,q);
  return (d,l,k-l*r); 

トリプレットを返すにはどうすればよいですか?

4

5 に答える 5

8

std::tupleトリプル ペアからor boost::tuple (C++0x を使用しない場合) を作成し、それを返すことができます。

于 2011-09-07T10:32:22.607 に答える
2

Tony The Tiger が提案したように、 tupleを使用できます。これは C++11 標準に含まれており、新しいコンパイラは既にサポートしています。boostにも実装されています。私の ibm xlC コンパイラのタプルは std::tr1 名前空間にあります (MSVC10 で試してみました — std 名前空間にあります)。

#include <cstdio>
#include <tuple>

// for MSVC
using namespace std;

// for xlC 
//using namespace std::tr1;

// for boost
// using namespace boost;

typedef tuple<int, float, char> MyTuple;
MyTuple f() {
    return MyTuple(1, 2.0f, '3');
}

int main() {
    MyTuple t = f();
    printf("%i, %f, %c\n", get<0>(t), get<1>(t), get<2>(t));
}

TR1 の xlC コンパイル:

xlC -D__IBMCPP_TR1__ file.cpp

ブースト用の xlC コンパイル:

xlC file.cpp -I/path/to/boost/root
于 2011-09-07T11:38:52.623 に答える
0

3 つの値を保持する適切なデータ構造を作成し、それを返すだけです。

struct extmod_t {
    int d;
    int i;
    int j
    extmod_t(int d, int i, int j) : d(d), i(i), j(j) { }
};

…

extmod_t result = extendedeuclidean(b, q);
return extmod_t(result.d, l, k - l * r);
于 2011-09-07T10:32:10.773 に答える
0

トリプレットをカプセル化するクラスを作成してから、このクラスのインスタンスを返すか、3 つの参照渡しパラメーターを使用します。

于 2011-09-07T10:33:09.847 に答える
0

通常、関数から 2 つのパラメーターを返す必要がある場合は、STL std::pair.

いつでもペアを互いに積み重ねて (例: std::pair <int, std::pair <int, int> >)、typedef-s または define を使用してアクセスしやすくすることができますが、これを実行しようとすると、コードが乱雑になり、再利用が実用的ではなくなります。

ただし、2 つ以上のパラメーターの場合は、必要な情報を保持する特定のデータ構造を独自に作成することをお勧めします (複数の値を返す場合、それらが何らかの形で強く論理的に接続されている可能性が高く、同じ構造を使用することになる可能性があります)。また)。

たとえば、直線の傾き (1 パラメータ) を返す関数が必要でしたが、それで問題ありませんでした。次に、線のパラメトリック表現の両方のパラメーターを返すように展開する必要がありました ( y = k*x + l)。2 つのパラメーター、まだ問題ありません。次に、線が垂直になる可能性があり、それを示すために別のパラメーターを追加する必要があることを思い出しました (その場合、パラメトリック表現はありません)... この時点で、既存のデータ型でやり遂げようとすると複雑になりすぎたので、独自のライン構造で、後でプロジェクト全体で同じ構造を使用することになりました。

于 2011-09-07T10:43:28.360 に答える