ehsan_faal
شنبه 06 تیر 1394, 07:07 صبح
سلام دوستان.
من یه template درست کردم که توی تابع هام استفاده کنم.
بر اساس اون template میام و یه وکتور درست میکنم و میدم به یه تابعی تا مقادیر اولیه رندوم بریزه توش.
مشکل اینجاست که با این که ظاهر کد درسته و توی تابع شرایطی رو قرار دادم که بر اساس نوع متغیرهای ارسالی به تابع مقادیر رندوم رو تولید کنه، بازم میره و قسمتهایی رو که نباید استفاده بشه رو استفاده میکنه.
#include <iostream>
#include <vector>
#include <random>
#include <time.h>
#include <algorithm>
#include <iomanip>
#include <type_traits>
using namespace std;
template<typename T = int>
using Matrix = vector<vector<T>>;
template<typename T>
void InitializeMatrix(Matrix<T> &UserMatrix, T MinRange, T MaxRange)
{
static_assert((is_integral<T>::value | is_floating_point<T>::value), "Input Type can be only instantiated with integer or floating point types");
default_random_engine eng(time(0));
if (is_same<T,int>::value)//(is_integral<T>::value)
{
for (auto& row : UserMatrix)
{
uniform_int_distribution<T> rng(MinRange, MaxRange);
for_each(row.begin(), row.end(), [&rng, &eng](T& element){
element = rng(eng);
});
random_shuffle(row.begin(), row.end());
}
}
else if (is_same<T, double>::value)//(is_floating_point<T>::value)
{
for (auto& row : UserMatrix)
{
uniform_real_distribution<T> rng(MinRange, MaxRange);
for_each(row.begin(), row.end(), [&rng, &eng](T& element){
element = rng(eng);
});
random_shuffle(row.begin(), row.end());
}
}
}
template<typename T>
void DisplayMatrix(Matrix<T> &matrix)
{
for (auto& row : matrix)
{
for_each(row.begin(), row.end(), [](T& element){
cout << setw(8) << setiosflags(ios::left) << element;
});
cout << endl;
}
}
int main()
{
Matrix<int> a(2, vector<int>(3, 0));
InitializeMatrix(a, -10, 35);
DisplayMatrix(a);
return 0;
}
مشکل اینجاست که با این که من int رو انتخاب کردم ولی همش میاد و خط 32 رو چک میکنه.
ضمنا چرا وقتی من یه همچین کدی داشته باشم خطا میگیره(بالفرض وکتور از نوع دابل و رنجها رو int بدم،مگه تبدیل int به دابل اتوماتیک نباید انجام بشه؟)
int row=2,column=3;
Matrix<double> Mat(row, vector<double>(column, 0));
InitializeMatrix(Mat, -3, 5);
DisplayMatrix(Mat);
ولی این یکی درسته(یعنی از نحوه call کردن توابع ایراد نمیگیره فقط همون ایرادهای قبلی باقی میمونه)
int row=2,column=3;
Matrix<double> Mat(row, vector<double>(column, 0));
InitializeMatrix(Mat, -3.0, 5.0);
DisplayMatrix(Mat);
من یه template درست کردم که توی تابع هام استفاده کنم.
بر اساس اون template میام و یه وکتور درست میکنم و میدم به یه تابعی تا مقادیر اولیه رندوم بریزه توش.
مشکل اینجاست که با این که ظاهر کد درسته و توی تابع شرایطی رو قرار دادم که بر اساس نوع متغیرهای ارسالی به تابع مقادیر رندوم رو تولید کنه، بازم میره و قسمتهایی رو که نباید استفاده بشه رو استفاده میکنه.
#include <iostream>
#include <vector>
#include <random>
#include <time.h>
#include <algorithm>
#include <iomanip>
#include <type_traits>
using namespace std;
template<typename T = int>
using Matrix = vector<vector<T>>;
template<typename T>
void InitializeMatrix(Matrix<T> &UserMatrix, T MinRange, T MaxRange)
{
static_assert((is_integral<T>::value | is_floating_point<T>::value), "Input Type can be only instantiated with integer or floating point types");
default_random_engine eng(time(0));
if (is_same<T,int>::value)//(is_integral<T>::value)
{
for (auto& row : UserMatrix)
{
uniform_int_distribution<T> rng(MinRange, MaxRange);
for_each(row.begin(), row.end(), [&rng, &eng](T& element){
element = rng(eng);
});
random_shuffle(row.begin(), row.end());
}
}
else if (is_same<T, double>::value)//(is_floating_point<T>::value)
{
for (auto& row : UserMatrix)
{
uniform_real_distribution<T> rng(MinRange, MaxRange);
for_each(row.begin(), row.end(), [&rng, &eng](T& element){
element = rng(eng);
});
random_shuffle(row.begin(), row.end());
}
}
}
template<typename T>
void DisplayMatrix(Matrix<T> &matrix)
{
for (auto& row : matrix)
{
for_each(row.begin(), row.end(), [](T& element){
cout << setw(8) << setiosflags(ios::left) << element;
});
cout << endl;
}
}
int main()
{
Matrix<int> a(2, vector<int>(3, 0));
InitializeMatrix(a, -10, 35);
DisplayMatrix(a);
return 0;
}
مشکل اینجاست که با این که من int رو انتخاب کردم ولی همش میاد و خط 32 رو چک میکنه.
ضمنا چرا وقتی من یه همچین کدی داشته باشم خطا میگیره(بالفرض وکتور از نوع دابل و رنجها رو int بدم،مگه تبدیل int به دابل اتوماتیک نباید انجام بشه؟)
int row=2,column=3;
Matrix<double> Mat(row, vector<double>(column, 0));
InitializeMatrix(Mat, -3, 5);
DisplayMatrix(Mat);
ولی این یکی درسته(یعنی از نحوه call کردن توابع ایراد نمیگیره فقط همون ایرادهای قبلی باقی میمونه)
int row=2,column=3;
Matrix<double> Mat(row, vector<double>(column, 0));
InitializeMatrix(Mat, -3.0, 5.0);
DisplayMatrix(Mat);