++C المتقدمة: مكتبة STL
سلسلة دروس بقلم: ســلوان الهلالي (SandHawk)
---------------------------------------------------------
(الجزء الأول)
مقدمة لـ STL ونوع std::string
ما هي STL؟
STL تعني Standard Template Library, وهي مكتبة برمجية تمثل أحد أجزاء مكتبة ++C القياسية. توفر STL عدداً من الخدمات هي containers و iterators و algorithms و functors. أهم جزء منها هو جزء الحاويات containers والذي يقدم عددأ من حاويات البيانات العالية المستوى مثل vector و list وبما إن جميعها مكتوب بإستخدام ميزة الـ templates, فتستطيع إستخدامها لأي نوع من أنواع البيانات سواء كانت عددية أو نصية كذلك ممكن إستخدامها مع الهياكل structures والأصناف classes.
تستند مكتبة STL الموجودة في أشكال ++C المختلفة المتاحة اليوم على مكتبة STL التي طورتها شركة SGI. و STL هو جزء من الـ C++ ISO.
محتويات STL
1. الحاويات Containers
- vector
- list
- (deque (double ended queue
2. الحاويات المترابطة:
- set
- multiset
- map
- multimap
- hash_set / hash_multiset / hash_map / hash_multimap
3. حاويات أخرى
- bitset
- valarray
2. المكرّرات Iterators
3. الخوارزميات Algorithms
4. الدوال الخاصة Functors
class Functor
{
public:
int operator()(int a, int b)
{
return a < b;
}
};
int main()
{
Functor f;
int a = 5;
int b = 7;
int ans = f(a, b);
}نوع std::string
إستخدام string
#include <string> using namespace std; // To get rid of "std::"
string s1 = "Hello World!";
char* c1 = "Hello World!"; string s1 = c1; // Simple! // string::c_str() will return the char* string. char* c2 = s1.c_str(); // output each to console: cout<<"The c string: "<<c1<<endl; cout<<"The std::string: "<<s1<<endl; // Or cout<<"The std::string: "<<s1.c_str()<<endl;
string s_out = "Ready!"; string s1 = " ,Get set!"; char* c1 = " ,Go!!!"; // concatenate all into s_out s_out += s1; // or s_out += s1.c_str(); // or s_out = s_out + s1; s_out += c1; // or s_out = s_out + c1; // output to console cout<<s_out(); //-------------------------------------------- // Or you can directly concatenate all strings: s_out = "Ready!"; s_out += s2 + c1; cout <<s_out();
- العامل "=!" (لا يساوي): يفحص ما إذا كان النص string على الجانب الأيمن لا يساوي النص string على الجانب الأيسر (يجب أن يكون الطرفان من نوع string)
string s1 = "This is Me"; string s2 = "This is not me"; if( s1 != s2 ) cout<<"s1 is not equal to s2."<<endl;
- العامل "==" (يساوي): يفحص ما إذا كان النص string على الجانب الأيمن يساوي النص string على الجانب الأيسر (يجب أن يكون الطرفان من نوع string)
- العامل ">" (أصغر من): يقوم بعملية مقارنة إستناداً إلى الكلمات والحروف, إذا وجد حرفان مختلفان في نفس الموقع من النصين سيكون ناتج المقارنة مستند على قيمة الحرفان, أما إذا وجد إن النصان متشابهان ولكن أحدهما يمتلك حروف أو كلمات إضافية سيعتبر النص الأول هو الأصغر, إذا لم يجد أي إختلافات فالنصين متطابقين.
- العامل "
- العامل "=>" (أصغر من أو يساوي): نفس عمل عملية الأصغر من, ولكنها تعيد "true" عند حالة التساوي أيضاً.
- العامل "=
- العامل "+": يقوم بعملية دمج نصين.
- العامل "[ ]": يتيح إمكانية دخول عناصر النص كمصفوفة إعتيادية:
string s1 = "Hello World!";
الآن جاء دور الدوال التي تقدمها std::string
- swap: تقوم بأخذ نصين من نوع string لكي تبدل النص بينهما, أي النص الأول ينتقل للثاني والثاني للأول.
- getline: يستخدم مجرى إدخال (input stream) لإدخال سطر من النص للـ sting.
- append
- assign
- at: تعيد مرجع reference للحرف الموجود في at من النص.
- begin
- c_str: تعيد النص الداخلي الذي هو بصيغة *char والمنتهي بـ NULL.
- capacity: تعيد أكبر حجم للنص ممكن خزنه في كائن string الحالي من دون الحاجة إلى إستخدام ذاكرة إضافية (no extending memory).
- clear: تمحي النص الموجود بالكامل.
- compare
- copy
- data
- empty: تفحص ما إذا كان النص فارغ أم لا, تعيد "true" إذا كان النص الحالي فارغ أو "false" إذا لم يكن.
- end
- erase: تقوم بمسح حرف أو مجموعة محددة من الحروف من النص.
- find: تبحث عن نص محدد بدءاً من بداية النص, في حالة العثور على النص المطلوب تعيد فهرس index أول حرف من النص المطلوب, أما إذا لم تعثر على شئ فسوف تعيد "npos".
- insert: تضيف حرف أو نص إلى الموقع المحدد.
- length أو size: تعيد عدد الحروف الموجودة في النص.
- max_size: أقصى عدد من الحروف يستطيع كائن string أن يتعامل بها (عدد كبير يساوي عادة4294967294أي ما يساوي 4 تيرابايت!!).
- push_back
- replace: تبدل النص المحدد بالنص الذي يتم تمريره.
- reserve
- resize: تحدد حجم جديد للنص, إذا كان الحجم المحدد أقل من النص الموجود سيتم حذف الحروف الزائدة.
- substr
مثال يبين كيفية تشكيل نص بإستخدام sprintf وتحويله إلى string:
char buf [255]; int n = 1505453; sprintf( buf, "Your ID number is: %d", n ); string s1 = buf;
الآن, المثال السابق نفسه ولكن بإستخدام المجاري النصية stringstream والتي هي أيضاً جزء من المكتبة القياسية للـ ++C, عمل stringstream مماثل لعمل cout و cin, ولكن بدل الإخراج للشاشة والإدخال من أجهزة الإدخال (لوحة المفاتيح تحديداً) فإنها تقوم بالإخراج والإدخال إلى نص من نوع string بنفس الطريقة تماماً:
#include <sstream> #include <string> using namespace std; //... stringstream ss; string s1 = "Your ID number is: "; int n = 1234124; ss<<s1; // Output s1 to the string stream ss<<n; // out put n to the string stream ss>>s1; // input the contents of the stream into // s1 string. // Or you can do it directly: ss<<s1<<n<<endl; ss>>s1; // Output to screen cout<<s1;
إستنتاج
الدرس القادمة إن شاء الله:


