00 // Illustrates the use of references for output parameters.
01 
02 #include <iostream>    
03 #include <string>
04 #include <vector>
05 #include <tuple>
06 
07 // Return the minimum, index og min, maximum, and index of maximum via reference parameters.
08 // Assume as precondition that vec holds at least one element.
09 //
10 void vector_min_max(const std::vector<double>& vec,
11                     double& min, int& min_index, double& max, int& max_index)
12 {
13     max = vec[0];
14     min = vec[0];
15     min_index = 0;
16     max_index = 0;
17   
18     for(auto i = 0; i < vec.size(); ++i)
19     {
20         if (vec[i] > max)
21         {
22             max = vec[i];
23             max_index = i;
24         }
25         if (vec[i] < min)
26         {
27             min = vec[i];
28             min_index = i;
29         }
30     }
31 }
32 
33 // Possible modern alternative
34 //
35 auto vector_min_max(const std::vector<double>& vec)
36 {
37     auto max = vec[0];
38     auto min = vec[0];
39     auto min_index = 0;
40     auto max_index = 0;
41 
42     vector_min_max(vec, min, min_index, max, max_index);  // reuse the implementation above...
43 
44     return std::make_tuple(min, min_index, max, max_index);
45 }
46 
47 int main () 
48 {
49   using namespace std;
50 
51   vector<double> v{1.1, -3.5, 7, 9, 0, -0.5};
52   double mi, ma;
53   int i_mi, i_ma;
54 
55   vector_min_max(v, mi, i_mi, ma, i_ma);
56 
57   cout << "Min: " << mi << " at: " << i_mi << endl;
58   cout << "Max: " << ma << " at: " << i_ma << endl;
59 
60   auto [mn, i_mn, mx, i_mx] = vector_min_max(v);  // structured binding
61 
62   cout << "Min: " << mn << " at: " << i_mn << endl;
63   cout << "Max: " << mx << " at: " << i_mx << endl;
64 }
65