PDA

View Full Version : سوال: مشکل با ایجاد لیستی از اشیا یک کلاس



root88
یک شنبه 07 شهریور 1389, 21:25 عصر
با سلام
من دو تا کلاس تعریف کردم که کلاس اول در واقع بیشتر تعریفه یه نوعه، تو کلاس دوم
می خوام یه لیست از این اشیا کلاس اول بسازم. اما تابع add ای که نوشتم خطا میده. ممنون میشم یه نگاهی به کد بندازید.به نظر شما باید کلاس لیست رو خودم از اول تعریف کنم؟

PC2st
یک شنبه 07 شهریور 1389, 21:31 عصر
این قسمت اشتباهست:



list <Action> actionList;
list<int>::iterator it;

...

it=actionList.end();


چون شما مقدار نتیجهٔ تابع actionList.end را می‌خواهید درون it بریزید، در حالیکه نوع آنها متفاوت است. پس نوع it را بصورت زیر تغییر دهید:


list<Action>::iterator it;

root88
یک شنبه 07 شهریور 1389, 21:46 عصر
مرسی اما بازم همون دوتا ایراد قبل رو داره. تابع Add رو به صورت زیر تغیر دادم اما یکی از خطاهاش برطرف نشد.



void Add(Action ac)
{
int c=actionList.size()+1;
actionList.insert(ac,c);
}



خطاش اینه:


Error 1 error C2664: 'std::list<_Ty>::_Iterator<_Secure_validation> std::list<_Ty>::insert(std::list<_Ty>::_Const_iterator<true>,const _Ty &)' : cannot convert parameter 1 from 'Action' to 'std::list<_Ty>::_Const_iterator<_Secure_validation>' c:\documents and settings\wini\my documents\visual studio 2008\projects\dla\dla\dla.cpp 38

PC2st
یک شنبه 07 شهریور 1389, 21:56 عصر
علاوه بر تغییرات قبلی

usingnamespace std;
را به:

using namespace std;
تغییر دهید.

و

actionList.insert(ac,it);
را به:

actionList.insert(it,ac);
تغییر دهید.

root88
دوشنبه 08 شهریور 1389, 16:02 عصر
ببخشید من یه سوال دیگه دارم،
می خوام تو تابع remove عنصری از لیست رو حذف کنم. تو کلاس لیستی که قبلا خودمون می نوشتیم از front شروی می کرد و یکی یکی جلو میرفت تا عنصر رو پیدا کنه و بعد حذفش می کرد. الان تو این کلاس تعریف شده چطوری front رو ببرم جلو؟


void Remove(int Id)
{
int index=-1;
for(int i=1;i<=actionList.size();i++)
if(actionList.front().getId()==Id)
index=i;
if(index!=-1)
actionList.remove(اینجا چی بنویسم )
else
یکی برو جلو

}

PC2st
دوشنبه 08 شهریور 1389, 19:45 عصر
خروجی تابع front اولین عضو در vector است و از نوع iteratorها نیست، بنابراین نمی‌توان آن را برای دسترسی به سایر اعضاء به جلو یا عقب برد. به جای تابع front از تابع begin استفاده کنید که به اولین عضو از vector اشاره می‌کند و می‌توانید توسط آن به سایر اعضا نیز دسترسی داشته باشید.



for(it = actionList.begin(); it < actionList.end(); ++it)
{
if(it->getId() == Id)
{
actionList.erase(it);
return;
}
}

برخلاف کلاس list، کلاس vector تابع remove ندارد، تفاوت تابع remove و erase در این است که تابع erase بر اساس iteratorها کار می‌کند ولی تابع remove بر اساس یک مقدار مشخص.

root88
پنج شنبه 11 شهریور 1389, 14:35 عصر
با سلام

من یه تعداد کلاس نوشتم، می خوام یه کلاس دیگه به اسم XL ایجاد کنم اما با این کلاس اخری مشکل دارم. این کلاس باید به تعداد مد نظر کابر شی از کلاسLA ایجاد کنه.برای همین یه وکتور از نوع LA در نظر گرفتم برای نگه داری این اشیا. هر شی LA یه لیست به اسم actions داره که باید مقدار گره هاشو از یه فایل بخونه( به عبارتی سطر اول فایل دادههای لیست اولین شیLA را فراهم میکنه ، سطر دوم فایل دادههای شی دوم و....).برای اینکار یه تابعXlinitialList نوشتم اما اصلا کار نمی کنه و چهار تا خطا میده .

من یه تابع change هم نوشتم که داده رو به صورت رشته میگیره و به عدد صحیح تبدیل میکنه و تو یه لیست قرار میده .این تابع وقتی بین اعداد کاماست درست کار میکنه ولی وقتی فاصله وجود داره نه. نمی دونم چیکارش کنم
خواهشا منو راهنمایی کنید.
--------------------
این کد برنامه است




#include "stdafx.h"


#include "Dla.h"


#include <iostream>


#include<list>


#include<vector>


#include<time.h>


#include<stdlib.h>


#include<fstream>


using namespace std;


class Action


{


int Id;


double Prob;


public:


Action(int Id,double Prob)


{


this->Id=Id;


this->Prob=Prob;


}


void setId(int v)


{Id=v;}


int getId()


{return Id;}


void setProb(double v)


{Prob=v;}


double getProb()


{return Prob;}


};


//----


class Actions


{


public:


list <Action> actionList;


list <Action>::iterator it;


void Add(Action ac)


{


it=actionList.end();


actionList.insert(it,ac);


}


void Remove(int Id)


{


for(it=actionList.begin();it!=actionList.end();it+ +)


if(it->getId()==Id)


actionList.erase(it);


}


void setEqualProb()


{


double x;


int count=actionList.size();


x=(double)1/count;


for(it=actionList.begin();it!=actionList.end();it+ +)


it->setProb(x);


}


};


//----


class LA


{


Actions actions;


double a,b;


list <Action>::iterator it;


public:


LA(double a,double b,Actions actions)


{


this->a=a;


this->b=b;


this->actions=actions;


}


void RewardAndPenalty(int Id,int response)


{


int r=actions.actionList.size();


if(response==1)


{


for(it=actions.actionList.begin();it!=actions.acti onList.end();it++)


if(it->getId()==Id)


it->setProb(it->getProb()*(1-b));


else


it->setProb(b/(r-1)+it->getProb()*(1-b));


}


else if(response==0)


{


for(it=actions.actionList.begin();it!=actions.acti onList.end();it++)


if(it->getId()==Id)


it->setProb(it->getProb()+a*(1-it->getProb()));


else


it->setProb(a*(1-it->getProb()));


}


}


int selectRandomAct()


{


srand(time(0));


int r=actions.actionList.size();


int n=1+rand()%r;


it=actions.actionList.begin();


n--;


while(n!=0)


{


it++;


n--;


}


return it->getId();


}


int selectBestAct()


{


int Id;


double maxProb=0;


for(it=actions.actionList.begin();it!=actions.acti onList.end();it++)


{ if(it->getProb()> maxProb)


{


Id=it->getId();


maxProb=it->getProb();


}


}


return Id;


}


};


//----


class XL


{


list<int> l;


list<int>::iterator it;


public:


vector<LA>VL;


void change(string s)//تبدیل رشته به عدد


{


int sum=0,x;


int c=s.length();


for(int i=0;i<c;i++)


{


if(s.at(i)!=' ')


sum=0;


while(s.length()!=i && s.at(i)!=' ')


{


x=s.at(i)-48;


sum=sum*10+x;


i++;


}


l.push_back(sum);


}


}


void XlinitialList(int n,double a,double b)


{


string st;


ifstream infile ;


infile.open("D:\\test.txt",ios::in);


if(!infile.is_open())


{cout<<"could not open file."; exit(1);}


for(int i=1;i<=n;i++)//create LA objectes n times and insert those in vector VL


{


Actions actions = new Actions();// creat actions object for each LA object(actions obj is a list of action)


infile.getline(st,255);// چطوری هر بار سطر بعدی رو بخونه؟


change(st);


for (it=l.begin();it!= l.end();it++ )


actions.Add(new Action(*it,0));


actions.setEqualProb();


LA La =new LA(a,b,actions);// create LA object with intialized actions


VL.push_back(La);


}


infile.close();


}


};


int main()


{


return 0;


}

root88
پنج شنبه 11 شهریور 1389, 14:38 عصر
این کد برنامه است:




#include "stdafx.h"
#include "Dla.h"
#include <iostream>
#include<list>
#include<vector>
#include<time.h>
#include<stdlib.h>
#include<fstream>
using namespace std;
class Action
{
int Id;
double Prob;
public:
Action(int Id,double Prob)
{
this->Id=Id;
this->Prob=Prob;
}
void setId(int v)
{Id=v;}
int getId()
{return Id;}
void setProb(double v)
{Prob=v;}
double getProb()
{return Prob;}
};

root88
پنج شنبه 11 شهریور 1389, 14:47 عصر
خطاهاش:افسرده:


Error 3 error C2664: 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::getline(_Elem *,std::streamsize)' : cannot convert parameter 1 from 'std::string' to 'char *' c:\documents and settings\wini\my documents\visual studio 2008\projects\dla\dla\dla.cpp 159
Error 4 error C2664: 'Actions::Add' : cannot convert parameter 1 from 'Action *' to 'Action' c:\documents and settings\wini\my documents\visual studio 2008\projects\dla\dla\dla.cpp 162
Error 5 error C2440: 'initializing' : cannot convert from 'LA *' to 'LA' c:\documents and settings\wini\my documents\visual studio 2008\projects\dla\dla\dla.cpp 164
Error 2 error C2440: 'initializing' : cannot convert from 'Actions *' to 'Actions' c:\documents and settings\wini\my documents\visual studio 2008\projects\dla\dla\dla.cpp 158

PC2st
پنج شنبه 11 شهریور 1389, 20:30 عصر
Actions actions = new Actions();// creat actions object for each LA object(actions obj is a list of action)کلمه کلیدی new برای اخذ حافظه از free store (که در پیاده‌سازی کامپایلرها همان heap است) استفاده می‌شود. پس کلمه کلیدی new را حذف کنید.

در خط زیر هم اینطور است و کلمه کلیدی new را حذف کنید:

actions.Add(new Action(*it,0));و همچنین در این خط:

LA La =new LA(a,b,actions);// create LA object with intialized actionsقبل از شروع به نوشتن هر خط، مطمئن شوید که درست عمل می‌کند. استفاده از مرجع کتابخانهٔ زبان، به شما در تشخیص قابلیت‌ها و استفاده از توابع کمک می‌کند. بطور مثال در این خط از کد شما:


infile.getline(st,255);// چطوری هر بار سطر بعدی رو بخونه؟st از نوع std::string است، در حالیکه تابع getlineای که عضو کلاس ifstream است، نمی‌تواند با نوع std::string کار کند، به جای آن باید اشاره‌گری به کاراکتر را به آن بدهید یا اینکه بهتر آن است که از تابع عمومی getline (که عضو هیچ کلاسی نیست) استفاده کنید. پس به جای خط قبل:



std::getline(infile, st);
بدون استفاده و کمک گرفتن از مرجع کتابخانه نمی‌توان برنامه نوشت، اگر به مرجعی دسترسی ندارید، این سایت‌ها مناسب هستند:

cplusplus.com
cppreference.com

root88
پنج شنبه 11 شهریور 1389, 20:47 عصر
خیلی خیلی از لطفتون ممنونم، بابت سایت ها هم ممنون.تابع مشکل دار رو به این صورت اصلاح کردم اما مشکلی که الان داره اینه که کل فایل رو می خونه ودر actions قرار میده. یعنی برای هر شی LA من داده های کل فایل رو دارم در حالیکه باید هر شی LA اولی سطر اول فایل رو داشته باشه ،شی LA دومی سطر دوم فایل و ... . چطوری هر بار یه سطر رو بخونه و بریزه داخل یک ارایه از کاراکترها و بار بعد سطر بعدی رو بخونه؟ من سایت cplusplus.com اما اینو از توش متوجه نشدم.





void DLAinitialList(int n,double a,double b)
{
string st="";
ifstream infile ;
char ch[256];
infile.open("D:\\test.txt",ios::in);
if(!infile.is_open())
{cout<<"could not open file."; exit(1);}
for(int i=1;i<=n;i++)//
{
Actions actions;
infile.getline(ch,255);//
st=ch;
change(st);

st.clear();
}
infile.close();
}

PC2st
پنج شنبه 11 شهریور 1389, 22:03 عصر
در تابع getline به جای ۲۵۵ عدد ۲۵۶ را قرار دهید زیرا طول ch برابر ۲۵۶ است.


چطوری هر بار یه سطر رو بخونه و بریزه داخل یک ارایه از کاراکترها و بار بعد سطر بعدی رو بخونه؟اگر منظور شما را بدرستی متوجه شده باشم (امیدوارم):
۱) متغیری از نوع std::string را به عنوان عضو کلاس LA تعریف کنید (این متغیر باید یک خط از فایل را درون خودش ذخیره کند). سپس تابع سازندهٔ (constructor) کلاس LA را طوری تعریف کنید که بتواند این متغیر را مقداردهی کند.
۲) از یک حلقهٔ while و درون شرط حلقه از تابع getline برای گرفتن تک تک خطوط و ذخیره‌کردن آن در متغیر ch، استفاده کنید.


while(infile.getline(ch, 256))
{
...
}
۳) درون بدنهٔ حلقه؛ یک شیئ LA بر اساس ch، ایجاد کنید و آنرا به شیئی از نوع XL (یا DLA در حالت جدید) اضافه کنید.

root88
پنج شنبه 11 شهریور 1389, 23:20 عصر
خیلی ممنون، برم تغییراتی رو شما گفتین اعمال کنم بلکه درست شه.

root88
جمعه 12 شهریور 1389, 12:24 عصر
سلام به پی سی دوست عزیز!تابع رو به این صورت اصلاح کردم مشکلش حل شده.
بابت کمکتون واقعا ممنون!:لبخندساده:



void DLAinitialList(int n,double a,double b)
{
string st="";
ifstream infile ;
char ch[256];
infile.open("D:\\test.txt",ios::in);
if(!infile.is_open())
{cout<<"could not open file."; exit(1);}
while(infile.getline(ch,256))
{
st=ch;
change(st);
Actions actions;
for (it=l.begin();it!= l.end();it++ )
{ Action action(*it,0);
actions.Add(action);
}

actions.setEqualProb();
LA La(a,b,actions);
dla.push_back(La);
st.clear();
l.clear();
}
infile.close();
}

root88
پنج شنبه 18 شهریور 1389, 07:50 صبح
با سلام، من بازم یه مشکلی دارم
تو تابع زیر من یه لیست دارم به نام actionList که شامل اشیایی از نوع action هست و هر کدم از این اشیا یک شناسه و یک نام دارند. این تابع شناسه یکی از action ها رو می گیره و خود اون شی رو بر میگردونه . تابع از اول لیست شروع میکنه و action ای که شناسه اش با شناسه ورودی یکی باشه باید برگردونده بشه .من نمی دونم جلوی دستور return چی بنویسم. لطفا راهنمایی کنید.


Action getAction(int id)
{
for(it=actionList.begin();it!=actionList.end();it+ +)
if(it->getId()==id) return ????;
else return ???
}

PC2st
پنج شنبه 18 شهریور 1389, 11:30 صبح
چون می‌خواهید خود همان شیئ توسط تابع getAction برگشت داده شود، پس خروجی آن را بصورت reference تعریف کنید:

Action& getAction(int id)به جای علامت سوال در جلوی دستور return بنویسید:

return *it;... و دستور else نیز نباید درون حلقه for قرار داشته باشد.

ویرایش: البته بهتر است که خروجی این تابع را از نوع همان متغیر it در نظر بگیرید و در دستور return نیز همان مقدار it را بازگردانید.

root88
چهارشنبه 24 شهریور 1389, 20:14 عصر
دوباره سلام، من یه سوال دیگه داشتم. تو کلاس زیر دو تا لیست تعریف شده می خوام تابعی بنویسم که دو لیست رو با هم merge کنه اما همش خطاهای چند خطی میده. لطفا راهنماییم کنید.



class Actions
{
public:
list <Action> actionList;
list <Action> InactionList;
list <Action>::iterator it;
.
.
.
.
void Merge()
{
actionList.merge(InactionList);
}
};

PC2st
چهارشنبه 24 شهریور 1389, 20:38 عصر
می‌توانید برای اینکار از تابع insert استفاده کنید:


actionList.insert(actionList.end(), InactionList.begin(), InactionList.end());

root88
جمعه 26 شهریور 1389, 18:48 عصر
با سلام، برنامه رو با کمک شما نوشتم و واقعا ممنونم.
اما یه مشکلی هست ازتون ممنون میشم برای چندمین بار کمک کنید،اونم اینکه که برنامه با اجرای خط به خط درست کار میکنه اما وقتیF5 میزنم جوابهای نامربوط میده. نمی دونم چیکارش کنم.:ناراحت:

PC2st
جمعه 26 شهریور 1389, 23:04 عصر
کلید F5 برای چه کاری است؟ احتمالاً برای اجرای برنامه است.
منظور شما از اجرای خط به خط همان اشکال‌زدایی برنامه است؟
تشخیص این مشکل بوجود آمده با این توضیحات سخت است، خطای خاصی نمی‌دهد؟

root88
جمعه 26 شهریور 1389, 23:14 عصر
بله
هیچ خطایی هم نمی ده حتی break هم نمیشه و کامل اجرا میشه،ولی حاصل کار که یه تعداد عدد هست رو توی یه فایل ذخیره میکنه اما این عدد های که انتخاب کرده و تو فایل ذخیره کرده غیر قابل قبوله.
در حالیکه وقتی خط به خط برنامه رو اجرا میکنم عددها کاملا درست انتخاب میشن. من نمی دونم چشه.

root88
یک شنبه 28 شهریور 1389, 20:04 عصر
باسلام
تو تابع زیر قراره از اول لیست تا اخرش شرطی رو چک کنم واگه شرط برقرار بود اون عنصر رو از لیست حذف کنم. وقتی عنصر رو حذف میکنم برای اینکه تکرار کننده اش از دست نره مجبور شدم به اول لیست ارجاعش بده اما این زمان زیادی میگیره . چون برای با حذف هر عنصری مجبوره دوباره بره اول اول لیست رو چک کنه. به نظر شما چطور اینو تغییر بدم.
ممنونم.


void PurningTree(int **tree,list<int>&l,int n)
{
list<int>::iterator it;
int x=l.front();
l.pop_front();
for(it=l.begin();it!=l.end();it++)
{
if(CountMat(tree,n,*it)==1)
{l.remove(*it);it=l.begin();}
}
l.push_front(x);

}

PC2st
یک شنبه 28 شهریور 1389, 22:34 عصر
متغیر it که همان iterator است را دارید، پس می‌توانید بجای تابع remove از تابع erase در جهت افزایش کارآیی استفاده کنید. می‌توانید از یک متغیر شمارنده برای شمارش اعضای پشت‌سر گذاشته‌شده، استفاده کنید:



int counter = 0;
for(it = l.begin(); it != l.end(); ++it, ++counter)
{
//do things here...
if(CountMat(tree, n, *it) == 1)
{
l.erase(it);
it = l.begin();
std::advance(it, counter);
}
}
از تابع advance استفاده شده است، چون std::list قابلیت دسترسی تصادفی ندارد (برای استفاده از عمل جمع) و برای به جلو بردن it باید به تعداد مورد نظر، عملگر ++ اعمال شود (اینکار توسط advance صورت می‌گیرد).

root88
یک شنبه 28 شهریور 1389, 22:37 عصر
خیلی ممنون، ببخشید یه سوال دیگه، برنامه ام باید در زمان کم به جواب برسه که متاسفانه اینطور نیست به نظر شما چطور میشه برنامه رو بهینه تر کرد. (البته من متوجه هستم که شما از برنامه من اطلاعی ندارید)

PC2st
یک شنبه 28 شهریور 1389, 23:29 عصر
در چه قسمتی از کدها احساس می‌کنید سرعت کمتر از حد مورد انتظار است؟ از کدهای همان قسمت شروع کرده و بررسی کنید (به اصطلاح بهینه‌سازی کنید).

با توجه به اینکه این گفتگو در مورد لیست‌هاست، از این مورد شروع می‌کنم:

۱) چه زمانی از کلاس std::list و چه زمانی از کلاس std::vector استفاده کنم؟ به عنوان یک قانون کلی (و البته غیر شفاف)، تغییر در لیست اعضای list سریعتر از vector صورت می‌گیرد و خواندن لیست اعضای vector سریعتر از list است. std::list همان لیست دو پیوندی است و std::vector یک آرایهٔ ساده است.
۲) تا اندازهٔ ممکن، از عملیات تکراری در برنامه جلوگیری کنید. مثلاً اگر تابع set_x مقداری را در x قرار می‌دهد و تابع get_x مقدار قرارگرفته شده را می‌خواند، اگر تابع get_x را بیشتر از تابع set_x در برنامه مورد استفاده قرار می‌دهید (که معمولاً همینطور است)، پس در صورت امکان، شرطها یا دستورات اضافه‌ایی که درون تابع get_x هستند را به درون تابع set_x منتقل کنید.
۳) از referenceها استفاده کنید بخصوص برای آرگومان توابعی که تعریف می‌کنید:


void do_something(AType var);
اگر متغیر var یک مقدار ساده نیست و حجم قابل ملاحظه‌ای دارد، بهتر است آنرا بصورت زیر تعریف کنید:


void do_something(const AType& var);
در اینصورت چون از reference استفاده شده، پس از کپی ناخواسته نیز جلوگیری به عمل آمده است.
۴) همواره از توابعی استفاده کنید که خاص‌تر هستند. توابع که کارایی خاص‌تری دارند، کار مورد نظر را بهتر انجام خواهند داد.
۵) ایجاد و نابودسازی اشیاء (متغیرهای ایجاد شده) را کمتر کنید.

ویرایش: اگر برنامهٔ خود را در حالت Debug کامپایل می‌کنید، سرعت اجرای آن کاهش خواهد یافت، پس برنامه را در حالت Release کامپایل کنید.

root88
دوشنبه 29 شهریور 1389, 02:19 صبح
با عرض پوزش،
کدی که تو پست 23 گذاشته بودید رو نوشتم اما برنامه به محض حذف یک عنصر از حلقه ای مربوط به عناصر این لیسته (حلقه بیرونی)خارج میشه .



int x=0;int flag;
for(it=tlist.begin();it!=tlist.end();++it,++x)
{flag=0;

for(it2=actions.actionList.begin(),it3=actions.Ina ctionList.begin();it2!=actions.actionList.end(),it 3!=actions.InactionList.end();it2++,it3++)
{
if(it2->getId()==(*it) || it3->getId()==(*it))
{
tlist.erase (it);
flag=1;
it=tlist.begin();
advance(it,x);
}
if(flag==1) break;
}
}

PC2st
دوشنبه 29 شهریور 1389, 10:37 صبح
در کد شما این قسمت:


it2!=actions.actionList.end(),it3!=actions.Inactio nList.end()
که در شرط حلقه قرار دارد، درست نیست، زیرا عملگر کاما برای اجرای نوبتی دستورات است. در اینجا ابتدا شرط برای it2 کنترل می‌شود، سپس بدون توجه به نتیجهٔ این شرط، نتیجهٔ شرط کنترل it3 برگشت داده می‌شود. اینطور فرض کنید که اصلاً شرط بررسی it2 وجود نداشته است! پس به جای عملگر کاما از && یا از || یا ... (با توجه به هدف این حلقهٔ تکرار از and یا از or یا ...) استفاده کنید.

اگر مشکل کاملاً حل نشده بود، بهترین راه برای یافتن مشکلات یک برنامه، اشکال‌زدایی آن است، آن را debug کنید و بخصوص مقدار متغیرها و همچنین نتایج شرطها را کنترل کنید.

root88
دوشنبه 29 شهریور 1389, 19:26 عصر
بازم ببخشید اما هر کاریش کردم درست نشد:ناراحت:. تو حلقه For دوم it2 رو افزایش نمی داد ولی it3 رو چرا .منم جفتشونو داخل نوشتم. مشکل دیگه ای داره اینه که وقتی عنصری رو حذف میکنه دستور advance درست کار میکنه اما وقتی برمیگره بالای حلقه اول از یه عنصر بعد از it شروع میکنه.


int flag,x=0;
for(it=tlist.begin();it!=tlist.end();it++,++x)
{
flag=0;
for(it2=actions.actionList.begin(),it3=actions.Ina ctionList.begin();it2!=actions.actionList.end() && it3!=actions.InactionList.end();)
{
if(flag==1)
break;
it2++;it3++;
}
}

PC2st
دوشنبه 29 شهریور 1389, 20:07 عصر
بازم ببخشید اما هر کاریش کردم درست نشد:ناراحت:. تو حلقه For دوم it2 رو افزایش نمی داد ولی it3 رو چرا .منم جفتشونو داخل نوشتم.
ببخشید، این قسمت از منظور شما را متوجه نشده‌ام.


مشکل دیگه ای داره اینه که وقتی عنصری رو حذف میکنه دستور advance درست کار میکنه اما وقتی برمیگره بالای حلقه اول از یه عنصر بعد از it شروع میکنه.
پس به تعداد یک واحد از میزان advance کم کنید (به اندازهٔ x-1 به جلو ببرید).

root88
دوشنبه 29 شهریور 1389, 20:44 عصر
ببخشید، این قسمت از منظور شما را متوجه نشده‌ام.
it3 یکی یکی لیست رو طی می کرد اما it2 همون عنصر اول لیست actionList رو نگه می داشت.


پس به تعداد یک واحد از میزان advance کم کنید (به اندازهٔ x-1 به جلو ببرید).
این کارو انجام دادم اما Break میشه.

PC2st
دوشنبه 29 شهریور 1389, 21:53 عصر
int flag,x=0;
for(it=tlist.begin();it!=tlist.end();it++,++x)
{
flag=0;
for(it2=actions.actionList.begin(),it3=actions.Ina ctionList.begin();it2!=actions.actionList.end() && it3!=actions.InactionList.end();)
{
if(it2->getId()==(*it) || it3->getId()==(*it))
{
tlist.erase (it);
flag=1;
it=tlist.begin();
advance(it,x);
}
if(flag==1)
break;
it2++;it3++;
}
}هرگاه اجرای برنامه به دستور advance برسد، با توجه به این کد، حتماً حلقه تکرار break خواهد شد (بدون توجه به مقدار advance شده بخاطر تعیین متغیر flag به عدد یک). در اینحالت نیازی به نوشتن دومین if نیست و می‌توانید دستور break را دقیقاً پس از دستور advance بنویسید. اگر منظور شما چیز دیگری بوده، پس if را به else if تغییر دهید تا همواره دستور break اجرا نشود.

ولی اگر منظور شما از break همان کرش کردن و توقف ناگهانی برنامه است، احتمالاً به خاطر این است که مقدار x در آن لحظه صفر بوده و با کم شدن یک واحد از آن، مقدار آن منفی خواهد شد. پس بررسی کنید که اولین عضو نباشد.

بهرحال متاسفانه من منظور و هدف شما از نوشتن این کدها را نمی‌دانم، در مورد نوشتن الگوریتم خود شما باید تصمیم بگیرید. می‌توانید یکبار بطور کامل از اول تا انتها توضیح دهید که چرا و چطور اینها را نوشتید و چه کاری می‌خواهید انجام دهید. اگر اینها را بخواهید برای من (یا هر کس دیگری) توضیح دهید، به احتمال بسیار زیاد قبل از آن، خود شما به راه حلی برای حل مشکل خود دست خواهید یافت.

root88
چهارشنبه 31 شهریور 1389, 10:09 صبح
با سلام
برنامه رو کامل کردم اما باز زمانش زیاده .تغییراتی که شما گفتید رو اعمال کردم اما کم نمیشه.

PC2st
چهارشنبه 31 شهریور 1389, 10:39 صبح
در نهایت، الگوریتمی که استفاده کرده‌اید را بررسی کنید (الگوریتم بیش از سایر موارد بر روی سرعت تأثیرگذار است).