جاري التحميل...

مرجع STL

مرجع STL في سي بلس بلس يعد جزءاً أساسياً من تطوير البرمجيات عالية المستوى باستخدام سي بلس بلس، حيث يوفر مكتبة قياسية غنية من الحاويات، الخوارزميات، والمكررات (Iterators) التي تسهل إدارة البيانات بكفاءة وأمان. أهمية مرجع STL تكمن في أنه يمكّن المطورين من التعامل مع الهياكل المعقدة للبيانات وتنفيذ الخوارزميات الشائعة دون الحاجة لكتابة شيفرات مكررة، مع ضمان الأداء الأمثل واستخدام أفضل لموارد النظام. عند تطوير تطبيقات سي بلس بلس، يمكن استخدام مرجع STL لإدارة القوائم، الخرائط، المجموعات، والطوابير، بالإضافة إلى استخدام خوارزميات مثل الفرز، البحث، والتراكم بطريقة معيارية وموثوقة. هذا المرجع يغطي المفاهيم الأساسية للغة سي بلس بلس مثل قواعد اللغة، الهياكل البيانية، المبادئ الكائنية مثل الوراثة، التغليف، والتعدد الشكلي، إضافةً إلى تحسين الأداء وتجنب الأخطاء الشائعة مثل تسرب الذاكرة وضعف التعامل مع الاستثناءات. من خلال دراسة مرجع STL، سيتعلم القارئ كيفية تطبيق الحاويات والخوارزميات بشكل عملي في مشاريع واقعية، مع تحسين قابلية الصيانة والموثوقية للأنظمة البرمجية، وفهم أفضل لكيفية دمج هذه المكونات ضمن بنية النظام المعقدة لتطوير حلول برمجية فعالة وقابلة للتوسع.

مثال أساسي

text
TEXT Code
\#include <iostream>
\#include <vector>
\#include <algorithm>

int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};

std::cout << "الأرقام الأصلية: ";
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;

std::reverse(numbers.begin(), numbers.end());

std::cout << "الأرقام بعد العكس: ";
for (auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;

return 0;

}

يوضح المثال أعلاه الاستخدام الأساسي لمرجع STL في سي بلس بلس، مع التركيز على الحاوية vector وخوارزمية reverse. يتم استدعاء مكتبات للطباعة على الشاشة، لإنشاء الحاويات الديناميكية، و لاستخدام الخوارزميات الجاهزة. يتم إنشاء vector باسم numbers يحتوي على عناصر من 1 إلى 5. الحلقة الأولى تستخدم نطاق foreach لعرض العناصر بطريقة آمنة وسهلة، مما يقلل الأخطاء المرتبطة بالمؤشرات التقليدية. بعد ذلك، تستخدم خوارزمية std::reverse لعكس ترتيب العناصر، وهي خوارزمية STL قياسية تعمل مباشرة على الحاويات دون الحاجة إلى كتابة حلقة يدوية. الحلقة الثانية توضح استخدام المكررات (Iterators) لتصفح العناصر، مما يعكس قدرة STL على توفير واجهة موحدة لجميع الحاويات. هذا المثال يُبرز أفضل ممارسات سي بلس بلس مثل استخدام الحاويات الديناميكية لتجنب تسرب الذاكرة، واستخدام auto لتسهيل كتابة الشيفرة، والاعتماد على الخوارزميات المدمجة لزيادة الأداء والقابلية للصيانة في المشاريع الواقعية.

مثال عملي

text
TEXT Code
\#include <iostream>
\#include <map>
\#include <string>
\#include <algorithm>

class Student {
public:
std::string name;
int score;

Student(std::string n, int s) : name(n), score(s) {}

};

int main() {
std::map\<std::string, Student> studentRecords;
studentRecords\["A101"] = Student("Alice", 85);
studentRecords\["B202"] = Student("Bob", 92);
studentRecords\["C303"] = Student("Charlie", 78);

auto maxScoreIt = std::max_element(studentRecords.begin(), studentRecords.end(),
[](const auto& a, const auto& b) { return a.second.score < b.second.score; });

if (maxScoreIt != studentRecords.end()) {
std::cout << "أعلى درجة: " << maxScoreIt->second.name
<< " - " << maxScoreIt->second.score << std::endl;
}

return 0;

}

Advanced سي بلس بلس Implementation

text
TEXT Code
\#include <iostream>
\#include <vector>
\#include <set>
\#include <algorithm>
\#include <memory>

class Task {
public:
std::string description;
int priority;

Task(std::string d, int p) : description(d), priority(p) {}

};

int main() {
std::vector\<std::shared_ptr<Task>> tasks;
tasks.push_back(std::make_shared<Task>("تصميم الوحدة", 2));
tasks.push_back(std::make_shared<Task>("تنفيذ الوظائف", 1));
tasks.push_back(std::make_shared<Task>("مراجعة الشيفرة", 3));

std::sort(tasks.begin(), tasks.end(), [](const auto& a, const auto& b) {
return a->priority < b->priority;
});

std::cout << "المهام مرتبة حسب الأولوية: " << std::endl;
for (const auto& task : tasks) {
std::cout << task->description << " - الأولوية: " << task->priority << std::endl;
}

std::set<int> priorities;
for (const auto& task : tasks) {
priorities.insert(task->priority);
}

std::cout << "الأولويات الفريدة: ";
for (int p : priorities) {
std::cout << p << " ";
}
std::cout << std::endl;

return 0;

}

أفضل الممارسات في سي بلس بلس عند استخدام مرجع STL تشمل استخدام الحاويات القياسية لتجنب تسرب الذاكرة، الاعتماد على الخوارزميات المدمجة لتقليل الأخطاء، واستخدام المكررات لتصفح العناصر بطريقة آمنة. الأخطاء الشائعة تشمل فقدان المؤشرات بعد تعديل الحاوية، استخدام الحلقات التقليدية مع vector كبير مما يؤدي إلى أداء منخفض، وعدم إدارة الاستثناءات بشكل صحيح. لتحسين الأداء، يُنصح باستخدام الحاويات المناسبة لكل حالة مثل set لتخزين عناصر فريدة، vector لتحسين الكفاءة المؤقتية، واستخدام smart pointers لإدارة الموارد تلقائياً. الأمن البرمجي يشمل التحقق من حدود الوصول للمؤشرات، استخدام const حيثما أمكن، وضمان سلامة البيانات عند التعامل مع بيئات متعددة الخيوط. اتباع مرجع STL بشكل صحيح يؤدي إلى كتابة شيفرة قوية، قابلة للصيانة، وعالية الأداء، مناسبة لتطوير الأنظمة المعقدة والبرمجيات المؤسسية.

📊 المرجع الشامل

سي بلس بلس Element/Method Description Syntax Example Notes
vector حاوية مصفوفة ديناميكية std::vector<Type> v; std::vector<int> v={1,2,3}; تدعم الوصول عن طريق الفهرس
vector::push_back إضافة عنصر في النهاية v.push_back(value); v.push_back(4); O(1) amortized
vector::size عدد العناصر v.size(); size_t n=v.size(); O(1)
vector::begin مكرر إلى أول عنصر v.begin(); auto it=v.begin(); للتعامل مع الخوارزميات
vector::end مكرر بعد آخر عنصر v.end(); auto it=v.end(); للتعامل مع الخوارزميات
vector::erase حذف عنصر v.erase(it); v.erase(v.begin()); O(n) للعناصر الوسطى
vector::insert إدراج عنصر v.insert(it,value); v.insert(v.begin()+1,10); O(n) للعناصر الوسطى
vector::clear مسح الحاوية v.clear(); v.clear(); تحرير الذاكرة
vector::empty التحقق من الفراغ v.empty(); if(v.empty()) ... O(1)
vector::front أول عنصر v.front(); int x=v.front(); إرجاع المرجع
vector::back آخر عنصر v.back(); int y=v.back(); إرجاع المرجع
list قائمة مرتبطة ثنائية std::list<Type> l; std::list<int> l={1,2,3}; إدراج/حذف سريع في أي موقع
list::push_back إضافة في النهاية l.push_back(value); l.push_back(4); O(1)
list::push_front إضافة في البداية l.push_front(value); l.push_front(0); O(1)
list::erase حذف عنصر l.erase(it); l.erase(l.begin()); O(1)
list::insert إدراج عنصر l.insert(it,value); l.insert(l.begin(),5); O(1)
deque صف مزدوج std::deque<Type> d; std::deque<int> d={1,2,3}; إدراج/حذف في البداية والنهاية بسرعة
stack مكدس LIFO std::stack<Type> s; std::stack<int> s; أخيراً دخل أولاً خارج
stack::push إضافة عنصر s.push(value); s.push(10); إضافة إلى الأعلى
stack::pop حذف عنصر s.pop(); s.pop(); إزالة الأعلى
stack::top عرض العنصر الأعلى s.top(); int t=s.top(); إرجاع المرجع
queue صف FIFO std::queue<Type> q; std::queue<int> q; أولاً دخل أولاً خارج
queue::push إدخال q.push(value); q.push(5); إضافة إلى النهاية
queue::pop حذف q.pop(); q.pop(); إزالة من البداية
queue::front عرض العنصر الأمامي q.front(); int f=q.front(); إرجاع المرجع
queue::back عرض العنصر الخلفي q.back(); int b=q.back(); إرجاع المرجع
priority_queue صف أولوية std::priority_queue<Type> pq; std::priority_queue<int> pq; القيمة العليا أولاً
priority_queue::push إضافة عنصر pq.push(value); pq.push(20); يحافظ على ترتيب الأولوية
priority_queue::pop حذف عنصر pq.pop(); pq.pop(); إزالة العنصر الأعلى
priority_queue::top عرض العنصر الأعلى pq.top(); int t=pq.top(); إرجاع المرجع
set مجموعة مرتبة std::set<Type> s; std::set<int> s; عناصر فريدة ومرتبة
set::insert إدراج عنصر s.insert(value); s.insert(10); O(log n)
set::erase حذف عنصر s.erase(value); s.erase(10); O(log n)
set::find البحث عن عنصر s.find(value); auto it=s.find(5); إرجاع iterator أو end()
unordered_set مجموعة غير مرتبة std::unordered_set<Type> us; std::unordered_set<int> us; O(1) متوسط
map خريطة مرتبطة std::map\<Key,Value> m; std::map\<int,std::string> m; عناصر مرتبة حسب المفتاح
map::insert إدراج زوج m.insert({1,"A"}); m.insert({2,"B"}); O(log n)
map::erase حذف مفتاح m.erase(key); m.erase(1); O(log n)
map::find البحث عن مفتاح m.find(key); auto it=m.find(2); إرجاع iterator
unordered_map خريطة غير مرتبة std::unordered_map\<Key,Value> um; std::unordered_map\<int,std::string> um; O(1) متوسط
algorithm::sort فرز std::sort(begin,end); std::sort(v.begin(),v.end()); IntroSort
algorithm::reverse عكس std::reverse(begin,end); std::reverse(v.begin(),v.end()); in-place
algorithm::find البحث std::find(begin,end,value); auto it=std::find(v.begin(),v.end(),3); إرجاع iterator أو end
algorithm::max_element أكبر عنصر std::max_element(begin,end); auto it=std::max_element(v.begin(),v.end()); إرجاع iterator
algorithm::min_element أصغر عنصر std::min_element(begin,end); auto it=std::min_element(v.begin(),v.end()); إرجاع iterator
pair زوج ثنائي std::pair\<Type1,Type2> p; std::pair\<int,std::string> p(1,"A"); مفيد في map
tuple زوج متعدد std::tuple\<Types...> t; std::tuple\<int,std::string,double> t(1,"A",2.5); C++11+
iterator مكرر container.begin()/end(); auto it=v.begin(); متوافق مع الخوارزميات
reverse_iterator مكرر عكسي container.rbegin()/rend(); auto rit=v.rbegin(); تصفح بالعكس
emplace إدراج في الموقع v.emplace(pos,value); v.emplace(v.begin(),10); فعال
emplace_back إدراج في النهاية v.emplace_back(value); v.emplace_back(20); تجنب النسخ
reserve حجز سعة v.reserve(n); v.reserve(100); تقليل إعادة التخصيص
capacity السعة الحالية v.capacity(); size_t c=v.capacity(); قد تكون أكبر من size
shrink_to_fit تقليص السعة v.shrink_to_fit(); v.shrink_to_fit(); غير إلزامي
array مصفوفة ثابتة std::array\<Type,N> a; std::array\<int,5> a={1,2,3,4,5}; C++11+
stack::empty التحقق من الفراغ s.empty(); if(s.empty()) ... O(1)
queue::empty التحقق من الفراغ q.empty(); if(q.empty()) ... O(1)
priority_queue::empty التحقق من الفراغ pq.empty(); if(pq.empty()) ... O(1)

📊 Complete سي بلس بلس Properties Reference

Property Values Default Description سي بلس بلس Support
vector::capacity size_t 0 السعة الحالية للحاوية C++98+
vector::size size_t 0 عدد العناصر C++98+
vector::empty bool true هل الحاوية فارغة C++98+
map::key_type Type None نوع المفتاح C++98+
map::mapped_type Type None نوع القيمة C++98+
set::key_type Type None نوع العنصر C++98+
deque::max_size size_t تعريف النظام الحد الأقصى للعناصر C++98+
unordered_map::load_factor float 0 عامل التحميل المتوسط C++11+
stack::size size_t 0 عدد العناصر C++98+
priority_queue::size size_t 0 عدد العناصر C++98+
array::size size_t 0 عدد العناصر الثابتة C++11+
tuple::size size_t ثابتة في وقت الترجمة عدد العناصر C++11+

بعد دراسة مرجع STL في سي بلس بلس، يتمكن المطورون من إدارة البيانات بكفاءة باستخدام الحاويات المعيارية والخوارزميات المتقدمة، مع تقليل الأخطاء الشائعة مثل تسرب الذاكرة وأخطاء المؤشرات. يوفر فهم STL أساساً قوياً لتصميم أنظمة برمجية قابلة للصيانة والتوسع، ويسهل دمج المبادئ الكائنية وهياكل البيانات المتقدمة في المشاريع الكبيرة. الخطوات التالية تشمل تعلم البرمجة المتوازية باستخدام الحاويات الآمنة للخيوط، إنشاء allocators مخصصة لتحسين الأداء، واستكشاف البرمجة القوالبية (Template Metaprogramming) لتعزيز مرونة STL في التطبيقات المعقدة. تطبيق مرجع STL بشكل عملي يضمن كتابة شيفرة عالية الجودة، آمنة، وفعالة، مناسبة للمؤسسات والمشاريع الكبيرة.

🧠 اختبر معرفتك

جاهز للبدء

اختبر معرفتك

تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع

3
الأسئلة
🎯
70%
للنجاح
♾️
الوقت
🔄
المحاولات

📝 التعليمات

  • اقرأ كل سؤال بعناية
  • اختر أفضل إجابة لكل سؤال
  • يمكنك إعادة الاختبار عدة مرات كما تريد
  • سيتم عرض تقدمك في الأعلى