الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

STL امكانات هائلة .. ولكن مهجورة,

مغلقرائج
بدأه Abdullah.Alshammeri في 16 يوليو 2006 · 58 رد · 6,203 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#26

جميع ما ذكرته موجود في ال STL

وأيضا مع ميزت تعدد الأوجهة

لكن بدون الحاجة إلى استخدام vritual فقط عن طريق ال template

وسيكون الكود أسرع بأضعاف ;)

ونسيت أن أقول أن Garbage Collection التي يتباهي بها مبرمجي #C و Java

تستطيع أن تطبقيها فقط في هذه المكتبة بدون عناء بالوراثة من ال class allocator وإعادة تعريف طرقه تكون قد بنيت GC خاص بك :lol:

والسلام عليكم ورحمة الله وبركاته

#27
Blueteeth كتب:
يا ريت حد يفهمنى إزاى ال STL مش مستخدمة البرمجة الشيئية و كلها كلاسات وارثة من بعض!!

أخوي 'Blueteeth'

البرمجة الشيئية تتكون من 3 عناصر أساسية وهي :

1) تغليف البيانات : وهو عن طريق ال class

2) الوراثة : وهذه تتم عندما يرث class الطرق و البيانات من class آخر .

3) تعدد الأوجه : وهذا يتم عن طريق virtual method حيث يملك كل كائن طريقته الخاصة به ويتم إستدعائها عن طريق handle

واحد إلي هو حق الbase

زادت بعدين بعض اللغات مفهوم ال property وغيرها

لكن الأساسية هي اللي فوق

وصحيح إن ال STL كلها كلاسات وارثة من بعضها لكن مفهمو ال base class او ال root class مو موجود فقط وهذا اللي مزعل Sultan_Althibity

تم تعديل هذه المشاركة بواسطة b.m.s في 17 يوليو 2006 في 14:32

#28

STL : مكتبة لتوفير الوقت في اعادة كتابة هياكل بيانات من جديد و خوارزميات موجودة و مكتوبة بطريقة سريعة و تدعم الGeneric Programming و اكثر ما استخدمه هو الوعاء vector .

STL ليست مفيدة للمبرمجين المبتدئين و طلاب علوم الحاسب ، فيجب اولاً ان يتلعموا كيف يكتبوا قائمة مرتبطة و يطبقوا خوارزميات البحث بإيديهم .

اعتقد مهما كانت خبرتي ، لن استطع ان اكتب وعاء مثل Vector من الصفر مثل ما موجود في المكتبة يدعم كل نوع بيانات و هي فكرة البرمجة Generic ...، و بسرعته في اداء الحجز و الغاء مواقع الذاكر لكميات هائلة من البيانات "الموجودة في الالعاب مثل تحميل 256 لاعب"...

و كل مبرمج له هوية من يحب ان يعرف ما وراء الستار و يحب ان يكتب بيده هياكل بيانات و خوارزميات ، و هناك شركات تحب ان تستخدم الجوهرة التي بيدهم في توفير وقتهم - مكتبة جاهزة مثل STL ...

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#29
احمد صالح كتب:
STL : مكتبة لتوفير الوقت في اعادة كتابة هياكل بيانات من جديد و خوارزميات موجودة و مكتوبة بطريقة سريعة و تدعم الGeneric Programming و اكثر ما استخدمه هو الوعاء vector .

STL ليست مفيدة للمبرمجين المبتدئين و طلاب علوم الحاسب ، فيجب اولاً ان يتلعموا كيف يكتبوا قائمة مرتبطة و يطبقوا خوارزميات البحث بإيديهم .

اعتقد مهما كانت خبرتي ، لن استطع ان اكتب وعاء مثل Vector من الصفر مثل ما موجود في المكتبة يدعم كل نوع بيانات و هي فكرة البرمجة Generic ...، و بسرعته في اداء الحجز و الغاء مواقع الذاكر لكميات هائلة من البيانات "الموجودة في الالعاب مثل تحميل 256 لاعب"...

و كل مبرمج له هوية من يحب ان يعرف ما وراء الستار و يحب ان يكتب بيده هياكل بيانات و خوارزميات ، و هناك شركات تحب ان تستخدم الجوهرة التي بيدهم في توفير وقتهم - مكتبة جاهزة مثل STL ...

أكثر مبرمجي الألعاب يستخدمون ال vector

وفقك الله ;)

#30

الكود

#define d(a,B) char(a+=B)

#define s® r##of

#define g(z) "Sal"##z##"ou"

void main(){int _=0x42;int a??(??)={0x2a,9,0xFFFFFFF0,0xF,0xFFFFFFF1,0

,15,0xFFFFFFF4??>;for(int i=0,__=_;i<s(size)(a)/4;i++){(i<1)&&putchar(0xB1)

&&(putchar(_));putchar(d(__,a[i??)));}printf(" %s%c%c",g("utes Y"),0xB1,10);??>

#31

الSTL مصممة لاعطاء أداء عالي للغاية و فيها كم من الOptimization الذي يصعب على أي مبرمج عادي أن يقوم به...

على سبيل المثال فانك لو قمت بحجز Vector على نوع الbool فان الSTL ستقوم بحجز bit واحد لكل value بدلاً من حجز byte كامل لكل value بهدف تقليل المساحة قدر الامكان و في نفس الوقت لن تشعرك و ستستخدمها عادي جداً

هناك بعض المعارضين لهذا الOptimization و لكن على الأقل هو مفيد جداً في حالة الذاكرة المحدودة مثل البرامج المكتوبة على الSmart Devices فكل byte له ثمنه

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#32
اقتباس
وأيضا مع ميزت تعدد الأوجهة

لكن بدون الحاجة إلى استخدام vritual فقط عن طريق ال template

وسيكون الكود أسرع بأضعاف

لم أفهـم كيف يتم إنجاز تعدد الأوجـه في وقت الترجمـة باستخدام القوالب ، هذه النقطـة لم أفهمها ....... أو أنه ربما يكون قصدك أنه من الممكن أن يكون للكلاس vector أكثر من وجـه .. مرة يكون int ومرة float ...... أنت تعرف ماذا أقصد بخصوص تعدد الأوجـه وأرجـو أن تعلمني عـن كيفية تحقيق ذلك باستخدام القوالب وليس الدوال الـ virtual لأني لا أعلم عـنها شيئاً بالفعل إن كانت موجودة ..........

بالنسبة للمكتبـة فما زلت على رأيي أنها مصممـة بأسلوب غير شيئي ، وأن الهـم الأول والأخير لها كان هـو إمداد المبرمج بخدمات متنوعـة مع كـود محسن لأقصى حد

#33
bashmohandes كتب:
الSTL مصممة لاعطاء أداء عالي للغاية و فيها كم من الOptimization الذي يصعب على أي مبرمج عادي أن يقوم به...

على سبيل المثال فانك لو قمت بحجز Vector على نوع الbool فان الSTL ستقوم بحجز bit واحد لكل value بدلاً من حجز byte كامل لكل value بهدف تقليل المساحة قدر الامكان و في نفس الوقت لن تشعرك و ستستخدمها عادي جداً

هناك بعض المعارضين لهذا الOptimization و لكن على الأقل هو مفيد جداً في حالة الذاكرة المحدودة مثل البرامج المكتوبة على الSmart Devices فكل byte له ثمنه

هذا ليس عذرا مقنعا لغباء الـ STL

كما اني اشك بعض الشيء في "ادائها العالي"

هل لي بسؤال؟ (ليس سؤال تهكمي .. فأنا بالفعل اسأل لاني لا اعرف)

ماذا يحصل حين ترسل vector الى function؟ هي يتم نسخ الـ vector بأكمله (يعني جميع عناصره) ام لا؟

لأنك لو كتبت:

vector<int> v1; 
......
/*
assume we have put alot of stuff in v1
*/

vector<int> v2 = v1; //the entire vector is copied over to v2

فحسب ما اذكر .. سوف يتم نسخ كافة محتويات v1 الى v2, فهل نفس الشي يحصل عند ارسال الـ vector كـ parameter الى function معين؟

#34

نعم سيتم نسخ المحتويات Passing by value لأن ال vector ما هو إلا كلاس و ليس كال array مثلا.

#35

المناقشة بالفعل رائعـة وأرجـو الاستمرار فيها ولكن تنقصها مشاركـة ثانيـة من الأخ swsws خاصـة أن الموضوع تشعب وأصبح من المواضيع المتقدمـة نسبياً !!!!!!!

#36

بالنسبة لموضوع passing الvector الى الfunction

أعتقد أنك لو أنشأت object حقيقي يعني بدون استخدام الpointers مثل

Vector<int> vec;

فهذا سيؤدي الى نسخ بيانات الVector عندما تستخدمه ك function paramerter

أما اذا استخدمت Vector<int> * vec

فهكذا أنت تمرر الpointer فقط و ليس كل الvector

و الله أعلم

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#37
bashmohandes كتب:
بالنسبة لموضوع passing الvector الى الfunction

أعتقد أنك لو أنشأت object حقيقي يعني بدون استخدام الpointers مثل

Vector<int> vec;

فهذا سيؤدي الى نسخ بيانات الVector عندما تستخدمه ك function paramerter

أما اذا استخدمت Vector<int> * vec

فهكذا أنت تمرر الpointer فقط و ليس كل الvector

و الله أعلم

على كدة يبقى مع السلامة يا effeciency!!

ماشي, عملت تجربة للتو:

#include <iostream>
#include <vector>
using namespace std;

typedef vector<int> intvec;

void modify( intvec v )
{
	v[0] = 10;
	cout << "modified vector: v[0] = " << v[0] << endl;
}

int main()
{
	intvec v1(30);
	v1[0] = 5;
	v1[2] = 4;

	cout << "befor passing : v1[0] = " << v1[0] << endl;
	modify(v1);
	cout << "after passing : v1[0] = " << v1[0] << endl;

	return 0;
}

و النتيجة:

befor passing : v1[0] = 5
modified vector: v[0] = 10
after passing : v1[0] = 5
Press any key to continue . . .

اذن, نلاحظ انه تم نسخ المصفوفة بالكامل!!

هل هذا هو الاداء العالي للغاية؟

#38

يا أخ حسن إنت زعلان ليه بس :), السى++ تتيح لك إختيار تمرير ال value أو ال reference, فقط ضع & إذا كنت تريد تمرير ال vector بالعنوان فقط. و هذا فى حد ذاته يعتبر أداء عاليا و مرونة حيث يتيح لك تمريره بالقيمة وقت ما تحتاج أو بالمرجع وقت ما تحتاج!! شفت الجمال :D.

#39
Blueteeth كتب:
يا أخ حسن إنت زعلان ليه بس :), السى++ تتيح لك إختيار تمرير ال value أو ال reference, فقط ضع & إذا كنت تريد تمرير ال vector بالعنوان فقط. و هذا فى حد ذاته يعتبر أداء عاليا و مرونة حيث يتيح لك تمريره بالقيمة وقت ما تحتاج أو بالمرجع وقت ما تحتاج!! شفت الجمال :D.

زين يعني عندك خيارين .. بطيء او سريع ..

و طبعا بما ان الـ C++‎ مصممة للسرعة و الاداء و انظمة التشغيل ..فالـ default هو الاداء البطيء!!

و كذلك الـ STL اللتي هي مصممة على نفس المبدأ .. الـ default فيها هو نسخ عناصر الـ vector جميعها!!

يعني حتى لو واحد مش خبير و لا يستطيع القيام بالـ optimizations المعقدة اللتي تقوم بها stl, فإنه يستطيع على الأقل ان يضع pointer داخل الـ vector بحيث ان المؤشر يشير الى المصفوفة الحقيقية, و هكذا حتى لو تم نسخ الـ vector فلن يتم نسخ جميع العناصر, بل ينسخ فقط المؤشر و ربما بعض المتغيرات البسيطة الموجودة داخل vector.

و لكنها الـ STL اللتي صممها الخبراء!!!! :rolleyes:

#40

أخوي hasan_aljudy

في النهاية وش اللي تبي توصله !!!!!!!!!!!!!! *-)

أنت مزعلتك الــSTL لأنها ما تدعم OOP بالشكل المطلوب -_-

أو مزعلتك الــSTL لأنها ماهي بالسرعة اللي تبغاها -_-

أو مزعلتك لأنها STL :lol:

دوختنا ودخنا معاك :wacko:

عموما قريبا راح أبدا بالدروس وإن شاء الله أول واحد راح يغير رأيه هو أنت وهذا وعد ;)

تم تعديل هذه المشاركة بواسطة b.m.s في 18 يوليو 2006 في 14:59

#41

نقاش ودي .. هذا كل ما في الأمر :P

ما اقوله هو رأيي بصراحة.

#43

من قال أن الdefault في ال++C هو الpass by value أو حتى الpass by ref و لكنه option أو خيار متاح لك و هو غير متاح في باقي اللغات التي تعتمد فقد على الpass by ref مع الObjects مثل ال #C أو الـJava

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#44

أنا لم أفهـم تعدد الأوجـه مع القوالب........ كيف ذلك؟ ..ممكن أحد يفهمها لي؟؟

#45
bashmohandes كتب:
من قال أن الdefault في ال++C هو الpass by value أو حتى الpass by ref و لكنه option أو خيار متاح لك و هو غير متاح في باقي اللغات التي تعتمد فقد على الpass by ref مع الObjects مثل ال #C أو الـJava

بل by value هو الـ default لانك عندما تـ pass اي object بشكل عادي دون اي اضافات فسيتم ارساله by value

الـ by ref موجود كـ option و ذلك بإضافة & او استخدام المؤشرات.

على فكرة, في الجافا و السي شارب يمكن ارسال الـ objects ايضا by value, كل ما عليك هو اضافة method و ليكن اسمه مثلا duplicate تخليه يعمل نسخة من الـ object و بعدين بدل ما تستخدم

foo( b )

تقوم باستخدام

foo( b.duplicate() )

اعتقد ان في الـ C++‎ معظم الناس يقومون بارسال الـ objects بطريقة by value بسبب مشاكل ادارة الذاكرة يدويا, يعني هناك احتمال ان يكون هذا الـ function هو في الحقيقة method في object معين, و قد يقوم هذا الـ object بالاحتفاظ بـ reference للـ object اللذي تريد ارساله, و في تلك الحالة فلن تستطيع عمل delete لأي كائن لانك لا تعرف اذا ما كانت هناك كائنات اخرى تحتفظ بـ reference لهذا الكائن او لا.

#46
Sultan_Althibity كتب:
أنا لم أفهـم تعدد الأوجـه مع القوالب........ كيف ذلك؟ ..ممكن أحد يفهمها لي؟؟

موجود لكن مع بعض التعديلات ;)

#47
اقتباس
بل by value هو الـ default لانك عندما تـ pass اي object بشكل عادي دون اي اضافات فسيتم ارساله by value

الـ by ref موجود كـ option و ذلك بإضافة & او استخدام المؤشرات.

هذا أيضاً لا يعني أن الdefault هو by value لأنه ببساطة لا يوجد شئ اسمه default في مبادئ اللغة بمعنى أن اللغة تدعم كل من الpass by ref و الpass by value و لكل منها طريقته في الsyntax و على المبرمج اختيار ما يناسبه ...

اقتباس
على فكرة, في الجافا و السي شارب يمكن ارسال الـ objects ايضا by value, كل ما عليك هو اضافة method و ليكن اسمه مثلا duplicate تخليه يعمل نسخة من الـ object و بعدين بدل ما تستخدم

و يمكتك أيضاً أن تقوم بعمل implement للinterface IClonable و تستخدم object.MemberWiseColne لعمل نسخة طبق الأصل من الobject و لكن في النهاية احتجت أن تكتب بعض الكود بنفسك لعمل هذا.. أما ال++C فيمكنها عمل هذا مباشرة باستخدام الCopy Constructor دون كتابة المزيد من الأكواد

في النهاية المشكلة ليست في اللغة بل المشكلة في هل استخدمتها بطريقة صحيحة أم لا

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#48

أخي b.m.s أنا بصراحـة لست واثقاً من أن الربط المتأخر من الممكن أن يحدث بدون virtual وأنه سيحدث في وقت الترجمـة .......... على العـموم أنا بانتظار شرحـك وأتمنى أن أستفيد منـه

#49
Sultan_Althibity كتب:
أنا لم أفهـم تعدد الأوجـه مع القوالب........ كيف ذلك؟ ..ممكن أحد يفهمها لي؟؟

موجود تعدد الأوجه مع القوالب وإذا تبي روابط عليه أعطيك :lol:

اقتباس
أخي b.m.s أنا بصراحـة لست واثقاً من أن الربط المتأخر من الممكن أن يحدث بدون virtual وأنه سيحدث في وقت الترجمـة .......... على العـموم أنا بانتظار شرحـك وأتمنى أن أستفيد منـه

لو كان الربط سيحدث وقت التنفيذ فلماذا لم يستخدموا virtual ؟؟؟؟؟ يعني هم هربوا من virtual عشان يطيحوا في template وكلهم نفس البطئ ؟؟؟؟ :wacko:

لكن هم وجدوا طريقة تؤدي تعدد الأوجه من جهة وتؤدي عمل virtual مع قليل من التعديل وبكذا أرضوا الطرفين ;)

وللمعلومية ترى تعدد الأوجه مو بس فقط مقصر على الوراثة فيه أنواع ثانية بس يمكن حق الوراثة أعظمها

والسلام عليكم ورحمة الله وبركاته

تم تعديل هذه المشاركة بواسطة b.m.s في 19 يوليو 2006 في 11:38

#50
اقتباس
يعني هم هربوا من virtual عشان يطيحوا في template وكلهم نفس البطئ ؟؟؟؟
استخدام الـ virtual ليس لجمال حروفـه بل لتحقيق تعدد الأوجـه والاستفادة من ميزات البرمجـة الشيئيـة ..... كما أن استخدام الـ virtual كنت أظن فيما مضـى أنه يؤدي إلى كارثـة في الأداء ولكن كل هذا الكلام مبالغ فيه.. والغارق في الأداء بسيط للغـاية ...... لاحظ أنك هـنا تهتـم بالسرعـة أكثر من مبادئ البرمجـة الشيئيـة ... إذا كنت هكذا فالسي هي البديل الأفضل لأنها أسرع من السي بلس بلس بمراحل

وللمعلومية ترى تعدد الأوجه مو بس فقط مقصر على الوراثة فيه أنواع ثانية بس يمكن حق الوراثة أعظمها

هـو ثلاثة أنواع تعدد الأوجـه ؛ تعدد أوجـه الدالات ، تعدد أوجـه العـملياتoperator مثل + و - و < ، تعدد أوجـه الكائنـات وهـو الأفضل

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…