PDA

View Full Version : تابعی همانند std::sort با قابلیت برگداندن indexs



JalaliMehr
جمعه 30 خرداد 1393, 09:27 صبح
سلام.

آیا راهی وجود داره که یک تابع همانند std::sort بنویسم که begin و end و lambda بگیره با این تفاوت که indexs جدید یعنی موقعیت جدید هر یک از خانه ها را بر گردونه؟



ممنون

rahnema1
جمعه 30 خرداد 1393, 11:41 صبح
سلام
شما می تونید یک کلاس درست کنید شامل دو ستون اندکس و مقدار و اون را sort کنید

#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>

struct field
{
int index;
double value;
};
bool lower( const field& x,const field& y)
{
return x.value < y.value;
}

typedef std::vector<field> indexedList;
int main(){
srand(time(NULL));
indexedList mylist(100);
for(int i = 0; i<100;i++)
{
mylist[i].index=i;
mylist[i].value=(rand()%100)/100.0;
}
std::sort(mylist.begin(),mylist.end(),lower);
for(int i = 0; i<100;i++)
std::cout<< mylist[i].index<<std::endl;
}

JalaliMehr
جمعه 30 خرداد 1393, 12:29 عصر
آخه دوست عزیز سوال منو خوندید؟ میگم یک تابع بنویسم!!!!
به مثال زیر دقت کنید.
struct Point{
Point(int _x,int _y):x(_y),y(_y){}
int x;
int y;
};

vector<int> sortCustom(begin,end,lamda){
}
int main(){
vector<Point> arr ={Point(10,1),Point(1,1),Point(6,1)};
sortCustom(arr.begin(),arr.end(),[](const Point& p1,const Point&p2){return p2.x > p1.x;});
}

یعنی مرتب سازی هایی که قبلا انجام میدادیم را بدیم به این تابع کاملا همانند تابع std::sort باشه و Indexs را برگردونه . در ضمن قصد ندارم نمی دونم std::pair یا یک کلاس از آن آبجکت مشتق کنم چون هر کاری قرار انجام بگیره تو همان تابع باشه.

amirtork
جمعه 30 خرداد 1393, 12:34 عصر
EDITED
EDITED
EDITED

JalaliMehr
جمعه 30 خرداد 1393, 12:53 عصر
آن کدی که ضمیمه کردم مثالشه دیگه!!!!! یک vector of class دارم که در حالت عادی با std::sort مرتبش می کنم حال قصد دارم تابعی بنویسم که بتونم lambda را روی کلاس اصلی بنویسم بدون تغییر کد و فقط indexs را تابع برگردونه

JalaliMehr
جمعه 30 خرداد 1393, 14:10 عصر
تو سایت هفت خط کد جواب دادند لینک (http://www.7khatcode.com/index.php?qa=4521&qa_1=%D8%AA%D8%A7%D8%A8%D8%B9%DB%8C-%D9%87%D9%85%D8%A7%D9%86%D9%86%D8%AF-std-sort-%D8%A8%D8%A7-%D9%82%D8%A7%D8%A8%D9%84%DB%8C%D8%AA-%D8%A8%D8%B1%DA%AF%D8%AF%D8%A7%D9%86%D8%AF%D9%86-indexs&show=4529#a4529)

rahnema1
جمعه 30 خرداد 1393, 15:38 عصر
تابع نوشتن هم خوبه. اما وقتی مجبور بشید اندکس را تولید و داده ها را هم کپی کنید هزینه را افزایش دادید. چه بهتر که از همون اول داده را به صورتی تعریف کنید که توی تابع مجبور نباشید هزینه اون را بدید

JalaliMehr
جمعه 30 خرداد 1393, 17:08 عصر
کد شما هم که همین کپی کردنو داره .یه خورده فکر کن ببین عقلانیه طرف قصد داشته باشه یه sort انجام بده کلی کد بنویسه تو کد اصلی، کد خواناییشو از دست میده.
در ضمن نمیشه رفت کل struct و کلاس های موجود کتابخانه ها را یک Index گذاشت برای مرتب سازی .
در انتهای پست آخرتون یعنی آف تاپیک و من هم مجبور شدم آف تاپیک بدم.

rahnema1
جمعه 30 خرداد 1393, 23:24 عصر
کد شما هم که همین کپی کردنو داره .یه خورده فکر کن ببین عقلانیه طرف قصد داشته باشه یه sort انجام بده کلی کد بنویسه تو کد اصلی، کد خواناییشو از دست میده.
در ضمن نمیشه رفت کل struct و کلاس های موجود کتابخانه ها را یک Index گذاشت برای مرتب سازی .
در انتهای پست آخرتون یعنی آف تاپیک و من هم مجبور شدم آف تاپیک بدم.

من کجا کپی کردم؟ یه اندکس درست کردم. داده ها را ایجاد کردم بعد تحویل تابع sort دادم. کجاش کپی بود؟
اما در تابعی که داده های ورودی دو باره به همراه اندکس ها در یک وکتور push_back بشن یعنی کپی.
حالا اگه می خواهید از تابع استفاده کنید یه روش بهینه بدون کپی هم در نظر داشتم که می خواستم به شما پیشنهاد بدم دیدم انگار یه کم از دست ما دلتنگ هستید. آف تاپیک هم نفهمیدیم یعنی چی
در ضمن درست نیست از اینجا یا سایت هفت خط کدها را کپی کنی بعدش هم به اسم خودت xyz اونجا قالب کنی ( قابل توجه دوستان هفت خط)
http://web.archive.org/save/http://stackoverflow.com/questions/1577475/c-sorting-and-keeping-track-of-indexes/24327593

JalaliMehr
شنبه 31 خرداد 1393, 07:53 صبح
همون جواب اولت هم آف تاپیک بود. در ضمن اون xyz دوستمه . اینجا تبادل می کنم 4 نفر چیزی یاد بگیرن از این به بعد سعی که در تاپیک های من پست ندی

rahnema1
شنبه 31 خرداد 1393, 10:51 صبح
همون جواب اولت هم آف تاپیک بود.

از همون اولی که جواب پستها را با علامت !!! دادی احساس کردم یه دق دلی از جایی داری می خواهی سر ما خالی کنی



در ضمن اون xyz دوستمه .

امان از رفیق ناباب



اینجا تبادل می کنم 4 نفر چیزی یاد بگیرن

تا جایی که توی پستهای شما دیدم اکثر قریب به اتفاق پستهای شما سوال هست نه جواب بنابراین به خاطر سوالهایی که پرسیدید منت سر کسی نذارید



از این به بعد سعی که در تاپیک های من پست ندی

با این اوصاف فکر نکنم از این به بعد کسی تمایل داشته باشه به سوالات شما پاسخ بده