Optional parameters: Difference between revisions

Content added Content deleted
(→‎{{header|Perl}}: move hash ref outside of comparison function)
(added c++)
Line 76: Line 76:
570 sort_table a$, 1, 5, 1
570 sort_table a$, 1, 5, 1
</pre>
</pre>

=={{header|C++}}==
This implementation only accepts function pointers for the comparators, and does not accept function objects, for simplicity.
<lang cpp>#include <vector>
#include <algorithm>
#include <string>

// helper comparator that is passed to std::sort()
template <class T>
struct sort_table_functor {
typedef bool (*CompFun)(const T &, const T &);
CompFun ordering;
int column;
bool reverse;
sort_table_functor(CompFun o, int c, bool r) :
ordering(o), column(c), reverse(r) { }
bool operator()(const std::vector<T> &x, const std::vector<T> &y) {
const T &a = x[column],
&b = y[column];
return reverse ? ordering(b, a)
: ordering(a, b);
}
};

// natural-order less-than comparator
template <class T>
bool myLess(const T &x, const T &y) { return x < y; }

// this is the function we call, which takes optional parameters
template <class T>
void sort_table(std::vector<std::vector<T> > &table,
int column = 0, bool reverse = false,
bool (*ordering)(const T &, const T &) = myLess) {
std::sort(table.begin(), table.end(),
sort_table_functor<T>(ordering, column, reverse));
}

#include <iostream>

// helper function to print our 3x3 matrix
template <class T>
void print_matrix(std::vector<std::vector<T> > &data) {
for () {
for (int j = 0; j < 3; j++)
std::cout << data[i][j] << "\t";
std::cout << std::endl;
}
}

// order in descending length
bool desc_len_comparator(const std::string &x, const std::string &y) {
return x.length() > y.length();
}

int main() {

std::string data_array[3][3] =
{
{"a", "b", "c"},
{"", "q", "z"},
{"zap", "zip", "Zot"}
};

std::vector<std::vector<std::string> > data_orig;
for (int i = 0; i < 3; i++) {
std::vector<std::string> row;
for (int j = 0; j < 3; j++)
row.push_back(data_array[i][j]);
data_orig.push_back(row);
}
print_matrix(data_orig);

std::vector<std::vector<std::string> > data = data_orig;
sort_table(data);
print_matrix(data);

data = data_orig;
sort_table(data, 2);
print_matrix(data);

data = data_orig;
sort_table(data, 1);
print_matrix(data);

data = data_orig;
sort_table(data, 1, true);
print_matrix(data);

data = data_orig;
sort_table(data, 0, false, desc_len_comparator);
print_matrix(data);

return 0;
}</lang>


=={{header|Common Lisp}}==
=={{header|Common Lisp}}==