بعد غياب طويل دام علي منتداي المفضل ومشرفه الاكثر من رائع الاخ رومانسي وبعد وعد بتقديم دوره مفصله
عن data structure قررت ان ابتدئ فيها لاهميتها الكبيره وقد نتتطرق الي stacd linked list tree heap
graph ومفهموم ال recurence والخ
المراجع المستخدمه كثيره وساحاول ان انوه علي اسم المرجع عند كل فقره لمخزيد من التفاصيل
وسيكون الحديث عن كفائه الخوارزميات والقارنه بين تلك الانواع مميزاتها استخدماتها وعيوبها والخ
واحب قبل ان ابدا في اي شئ ان اقوم بشرح بسيط عن template لاهميتها وكثره استعمالها معنا في المرحله السابقه
يمكن يكون الموضوع طويل بعد الشئ ولكنه مهم معرفته واسف علي عدم تنسيق الموضوع بالقدر الكافئ لاني لست لدي االخ
لدي الخبره الجماليه في ذلك الامر
part1:template
اذا تكلمنا عن template الترجمه العربيه لها وهي القوالب والقوالب هيا اشياء جاهزه يتم استعمالها لاكثر من استخدام
من نفس طريقه الاستخدام
علي سيبل المثال تنقسم القوالب الي داله او فصيله
لنفرض مثلا اننا نريد ان نقارن بين عددين
1 10
1.2 2.5
555555555555555555555555555 999999999999999999999999999999
a b
فاذا افترضنا علي تلك الحالات اننا سنقوم بعمل اربع دوال لكي تتعمال مع الانواع المتغيره من المدخلات
int float double char
وهذا سيكلفنا كتابه اسطر كثيره بلاداعي وكذلك وقت تنفيذ اعلي قد يؤثر علي سرعهالبرنامج الخاص بنا
والحل هو اننا نقوم بعمل داله واحده تقوم بعمل المقارنه مهما اختلفت الانواع المرسله
طريقه الاعلان عن داله من نو ع القالب
كود:template <class identifier> function_declaration;هنا استعمنا الكلمه المحجوزه Template لنعلم المترجم انها داله من نوع تيمبلات
ثم نقوم بتوليد فصيله معرفه داخلها الداله ونتطرق لفائدتها مع الاسطر القادمه
ويفضل ان يكون معرف الفصيله
class T
حيث T اختصار للحروف وكذلك لكلمه TEMPLATE
ثم اسم الداله
شاهد معي الكود التالي
كود:template <class myType>myType GetMax (myType a, myType B) { return (a>b?a:B);}لاحظ هنا اننا في الداله get max تحمل معاملين my type a,b
وهما لم يحدد نوعهما الان ولكنهما سيحلان مكان المعاملات المرسله
اذا كانت االاسطر السابقه مازالت محيطه بالغموض فانظر معي الي الكود القادم ستجد الموضوع اصبح ان شاء الله
واضح وبدا معني القالب يظهر بشده واهميته
كود:// function template#include <iostream>using namespace std;//declare temp. func template <class T>T GetMax (T a, T B) { T result; // result has same type of a,b result = (a>b)? a : b; //function that return great number return (result);}int main () { int i=5, j=6, k; long l=10, m=5, n; k=GetMax<int>(i,j); //use func with int param n=GetMax<long>(l,m); ////use func with long param cout << k << endl; cout << n << endl; return 0;}بالتمعن في الكود السابق
سيجذبني تلات نقاط
1-التصريح عن الداله get max ومعاملات الازاحه الخاصه بها وهيا ليست نوع محدد
2-في الداله الرئيسيه main
كود:k=GetMax<int>(i,j);هنا وضعنا تعريف للداله انها من النوع الصيحيح وبناء علي ذلك سيقوم المترجم بتحول المعامل للداله القالبه الي النوع الصحيح
الصحيح اوتامتيكيا وسيحمل result النوعيه الصحيحه
3- كود:n=GetMax<long>(l,m);وهنا للاننا نستعمل النوعيه long قم بتعريف المترجم بهذا كيف يفعل المطلوب كما في الخطوه 2
ليتحول النوعيه للقالب الي النوعيه المطوله
نستنتج من السابق اننا وفرنا علي نفسنا عناء كتابه اكثر من داله للمقارنه بداله واحده تقوم بجميع الاغراض
وكذلك كان يمكننا كتابه الكود هذا
كود:k=GetMax(i,j); n=GetMax(l,m);وسيقوم المترجم بتعريفه اوتامتيكيا
ماذ ا لو اردنا انا نقارن بين نوعيا مختلفه من المعاملات
كالمقارنه بين 11 و11.52
وهما من النوعيه الصحيحه والمعومه كود:template <class T, class U>T GetMin (T a, U B) { return (a<b?a:B);}لاحظ هنا اننا اعلنا عن فصيلتين مختلفتين هما t u بعكس المثال السابق
;كانت فصيله واحده هي T
ويكون الاستدعاء من خلال الداله الرئيسيه علي هذا الشكل
كود:int i,j;long l;i = GetMin<int,long> (j,l);,والملاحظ ان القيمه المرجعه ستخزن في المتغير I بنفس نوعيته
ويمكن تبسيط الكود السابق ليصبح
كود:i = GetMin (j,l);ليعود الدور للمترجم للتحديد
Class template
وبعد ان ذكرنا فائده الداله القالبه نتتظرق للفصيله القالبيه
فالفصيله لها اعضاء داخلها
لنتتطرق الي المثال التالي مباشره
كود:// class templates#include <iostream>using namespace std;//declare class template template <class T>class mypair { T a, b; public: mypair (T first, T second) //build func {a=first; b=second;} T getmax (); //func };//difination of sunc of class template <class T>T mypair<T>::getmax () // use of (::) to accsee the member of class { T retval; //retval =return val retval = a>b? a : b; return retval;}int main () { mypair <int> myobject (100, 75); //declare object to class cout << myobject.getmax(); return 0;}وبالنظرر الي التعليقات سيكون الامر مفهوما دون دخول في تفاصيل
Template specialization:
هنا تظهر ميزه جيده للقوالب
ماذا مثلا
لو اردنا
ان يقوم المستخدم بادخال قيمه
مهما كانت نوعيتها
واحتجنا ان نزيد تلك القيمه بواحد
مثلا
1 يصبح 2
105 يصبح 11.5
ماذا لو اردنا ان يكون الحرف المدخل صغير ونقوم بتكبيره
a يصبح A
مع نفس الداله
هنا سنقوم بعمل تعرف مخصص للوظيفه معينه
كود:// template specialization#include <iostream>using namespace std;// class template:template <class T>class mycontainer { T element; public: mycontainer (T arg) {element=arg;} //BUILD FUNC T increase () {return ++element;} //FUNC OF CLASS };// class template specialization:template <>class mycontainer <char> { char element; //specialization for char type public: mycontainer (char arg) {element=arg;} char uppercase () { if ((element>='a')&&(element<='z')) //check small letter or not element+='A'-'a'; //added the asci value to convert the elment we can use 24 direct return element; }};int main () { mycontainer<int> myint (7); mycontainer<char> mychar ('j'); cout << myint.increase() << endl; cout << mychar.uppercase() << endl; return 0;}بالتمعن في الكود السابق جيدا سنجد الامر الجديد اانا قما بعما قالب خاص للمتغير من النوع الحرفي
ونلاجظ اننا اعدنا تعريف كافه الاعضاء لاننا التخصيص لايدعم خاصيه التوريث من القالب الرئيسي
كما تلاحظ في الكود هنا حين يكون المدخل رقم سيتعمل القالب العام
واذا تم ادخال حرف سيتعمل القالب الخاص لينفذ وظيفه مغايره للقالب العام
Non-type parameters for templates
فائده تلك النوع وهيا اعطائك قدر من المرونه في التعامل مع المعاملات المتغيره مثل الدوال السابق شرحها
تابع
معي الكود وسيكون الامر سهلا
كود:// sequence template#include <iostream>using namespace std;template <class T, int N>class mysequence { T memblock [N]; //array can hold any type public: void setmember (int x, T value);//inialization func T getmember (int x);};template <class T, int N> //definationvoid mysequence<T,N>::setmember (int x, T value) { memblock[x]=value;}template <class T, int N>T mysequence<T,N>::getmember (int x) { return memblock[x];}int main () { mysequence <int,5> myints; //array now in int type 5 is an index mysequence <double,5> myfloats; //array now in double type myints.setmember (0,100); myfloats.setmember (3,3.1416); cout << myints.getmember(0) << '\n'; cout << myfloats.getmember(3) << '\n'; return 0;}وهنا اقوم قد اتممت باختصار ماهو القالب اعتمادا مني ان قارئ الموضوع ملم بمفهموم الفصيله والدوال جيدا
اي استفسار ان شاء لله بكون جاهز
مصدر الموضوع
http://www.cplusplus.com/doc/tutorial/templates.html
والحلقه القادمه سكون علي اول نوع من الداتا استركشر واكثرا معرفه للناس هيا array ثم stack
يا جماعة انا ناقل الموضوع من منتديات العاصفة ولكم جزيل الشكر
يتبع ......