C++ で関数から複数の値を返す
この記事では、C++ の関数から複数の値を返す方法に関する複数のメソッドについて説明します。
C++ で struct
を使って関数から複数の値を返す
カスタム定義の struct
変数を使用して、関数から複数の値を返すことができます。つまり、整数のベクトル
で最大値/最小値を検索する関数から int
ペアを返す 2つのデータメンバー構造を実装する例を示します。ニーズに合わせて任意のタイプの struct
を定義し、データメンバー数を拡張できることに注意してください。この場合、ローカルの struct
変数を findMaxMin
関数スコープで宣言し、値で main
ルーチンに返します。struct
変数は、main
関数で初期化し、参照によって findMaxMin
に渡して、結果値をそこに格納することもできます。
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;
struct IntPair {
int first, second;
} typedef IntPair;
IntPair findMaxMin(vector<int> &arr) {
IntPair ret;
int max = arr[0];
int min = arr[0];
for (const auto &item : arr) {
if (item > max) max = item;
if (item < min) min = item;
}
ret.first = max;
ret.second = min;
return ret;
}
int main() {
vector<int> array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
auto ret = findMaxMin(array);
cout << "Maximum element is " << ret.first << ", Minimum - " << ret.second
<< endl;
return EXIT_SUCCESS;
}
出力:
Maximum element is 20, Minimum - 1
C++ で std::pair
を使って関数から複数の値を返す
std::pair
は C++ 標準ライブラリで提供されており、ペアのように 2つの異種オブジェクトを格納できます。したがって、カスタムの struct
を定義せずに前の例を再実装できます。std::pair
にはすでに広範な機能が組み込まれているためです。1つの欠点は、他の複数要素構造を格納しない場合にのみ 2つの値を返すことができることです。max
/min
検索アルゴリズムを STL アルゴリズムと交換したことに注意してください-それぞれ std::max_element
と std::min_element
。
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;
std::pair<int, int> findMaxMin2(vector<int> &arr) {
std::pair<int, int> ret;
auto max = std::max_element(arr.begin(), arr.end());
auto min = std::min_element(arr.begin(), arr.end());
ret.first = arr.at(std::distance(arr.begin(), max));
ret.second = arr.at(std::distance(arr.begin(), min));
return ret;
}
int main() {
vector<int> array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
auto ret = findMaxMin2(array);
cout << "Maximum element is " << ret.first << ", Minimum - " << ret.second
<< endl;
return EXIT_SUCCESS;
}
出力:
Maximum element is 20, Minimum - 1
C++ で配列を使って関数から複数の値を返す
または、C スタイルの配列を宣言して、関数に複数の値を格納して返すこともできます。このメソッドは、大量の値を操作するためのより簡単なインターフェースを提供します。呼び出し元関数で配列を宣言し、そのアドレスを呼び出し先に渡す方が効率的です。このように、巨大な配列でさえ、オーバーヘッドを増やすことなく、たった 1つのポインターを使用して渡すことができます。
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;
int *findMaxMin2(vector<int> &arr, int ret[]) {
auto max = std::max_element(arr.begin(), arr.end());
auto min = std::min_element(arr.begin(), arr.end());
ret[0] = arr.at(std::distance(arr.begin(), max));
ret[1] = arr.at(std::distance(arr.begin(), min));
return ret;
}
int main() {
vector<int> array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
int ret_array[2];
auto ret = findMaxMin2(array, ret_array);
cout << "Maximum element is " << ret[0] << ", Minimum - " << ret[1] << endl;
return EXIT_SUCCESS;
}
出力:
Maximum element is 20, Minimum - 1