distance
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору LuckyStrike Код: #include <functional> #include <algorithm> #include <iterator> /* Написать функцию, выполняющую с матрицей действия, описанные в варианте. Задать в программе 2 матрицы различного размера, и проверить на них работу написанной функции: В данной действительной матрице размера nxm поменять местами строку, содержащую элемент с наибольшим значением, со строкой, содержащей элемент с наименьшим значением. Предполагается, что эти элементы единственны. */ // выбор строки, удовлетворяющей условию template <typename T, template <typename> class _Comparer> struct row_f : public std::binary_function<T, T, bool> { row_f() : cmp_(_Comparer<T>()) {} template <const size_t N> bool operator()(const T (&arr1)[N], const T (&arr2)[N]) const { return *std::min_element(arr1, arr1+N, cmp_) < *std::min_element(arr2, arr2+N, cmp_); } const _Comparer<T> cmp_; }; // обмен значений строк в массиве template <typename T, const size_t N> void rows_swap(T (&arr1)[N], T (&arr2)[N]) { if (&arr1 == &arr2) return; for (size_t i=0; i<N; i++) std::iter_swap(arr1+i, arr2+i); } template <typename T, const size_t Rows, const size_t Cols> void rows_swap(T (&m)[Rows][Cols]) { T (*it1)[Cols] = std::min_element(m, m+Rows, row_f<T, std::less>()); // строка с наименьшим значением T (*it2)[Cols] = std::max_element(m, m+Rows, row_f<T, std::greater>()); // строка с наибольшим значением rows_swap(*it1, *it2); }; | использование Код: template <typename OS, typename T, const size_t N> OS& operator << (OS& os, const T (&arr)[N]) { os << "["; std::copy(arr, arr+N, std::ostream_iterator<T>(os, " ")); return os << "]"; } template <typename OS, typename T, const size_t Rows, const size_t Cols> OS& operator << (OS& os, const T (&m)[Rows][Cols]) { os << "[" << std::endl; for (size_t i=0; i<Rows; i++) os << "\t" << m[i] << std::endl; return os << "]"; } int main() { const size_t Rows = ...; const size_t Cols = ... int m[Rows][Cols] = { ... } ; std::cout << "Array before: " << m << std::endl; rows_swap(m); std::cout << "Array after: " << m << std::endl; return (0); } |
| Всего записей: 878 | Зарегистр. 28-03-2004 | Отправлено: 19:10 08-01-2009 | Исправлено: distance, 19:15 08-01-2009 |
|