مرجع STL
مرجع STL في سي بلس بلس يعد جزءاً أساسياً من تطوير البرمجيات عالية المستوى باستخدام سي بلس بلس، حيث يوفر مكتبة قياسية غنية من الحاويات، الخوارزميات، والمكررات (Iterators) التي تسهل إدارة البيانات بكفاءة وأمان. أهمية مرجع STL تكمن في أنه يمكّن المطورين من التعامل مع الهياكل المعقدة للبيانات وتنفيذ الخوارزميات الشائعة دون الحاجة لكتابة شيفرات مكررة، مع ضمان الأداء الأمثل واستخدام أفضل لموارد النظام. عند تطوير تطبيقات سي بلس بلس، يمكن استخدام مرجع STL لإدارة القوائم، الخرائط، المجموعات، والطوابير، بالإضافة إلى استخدام خوارزميات مثل الفرز، البحث، والتراكم بطريقة معيارية وموثوقة. هذا المرجع يغطي المفاهيم الأساسية للغة سي بلس بلس مثل قواعد اللغة، الهياكل البيانية، المبادئ الكائنية مثل الوراثة، التغليف، والتعدد الشكلي، إضافةً إلى تحسين الأداء وتجنب الأخطاء الشائعة مثل تسرب الذاكرة وضعف التعامل مع الاستثناءات. من خلال دراسة مرجع STL، سيتعلم القارئ كيفية تطبيق الحاويات والخوارزميات بشكل عملي في مشاريع واقعية، مع تحسين قابلية الصيانة والموثوقية للأنظمة البرمجية، وفهم أفضل لكيفية دمج هذه المكونات ضمن بنية النظام المعقدة لتطوير حلول برمجية فعالة وقابلة للتوسع.
مثال أساسي
text\#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. يتم استدعاء مكتبات
مثال عملي
text\#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\#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 بشكل عملي يضمن كتابة شيفرة عالية الجودة، آمنة، وفعالة، مناسبة للمؤسسات والمشاريع الكبيرة.
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى