در این قسمت از آموزش کتابخانهی الگوی استاندارد یا STL به بحث درمورد نگهدارندهی vector (بردار) خواهیم پرداخت.
بردارها (vectors) شبیه به آرایههای پویا هستند با این قابلیت که زمانی که یک عنصر، درج یا حذف میشود، بهطور خودکار تغییراندازه میدهند که توسط نگهدارنده به طور خودکار محل ذخیرهسازیشان مدیریت میشود. عناصر بردار (vector) به طور پیوسته ذخیره میشوند، به طوری که آنها میتوانند با استفاده از پیمایشگرها، پیمایش و در دسترس قرار گیرند.
در بردارها، دادهها در انتهای بردار درج میشود. درج کردن در انتهای بردار زمان متفاوتی میگیرد. گاهی اوقات ممکن است نیاز به گسترش آرایه باشد. حذف کردن عنصر آخر، زمان ثابتی را میگیرد، چرا که هیچ تغییراندازهای اتفاق نمیافتد. درج کردن و پاککردن در ابتدا یا در وسط بردار در زمان خطی است.
توابع خاص مربوط با بردار به این صورت هستند:
پیمایشگرها (Iterators)
- begin: یک پیمایشگر که به اولین عنصر در بردار اشاره میکند، برمیگرداند.
- end: یک پیمایشگر که به عنصری تئوری که آخرین عنصر در بردار را دنبال میکند، اشاره میکند.
- rbegin: یک پیمایشگر معکوس که آخرین عنصر در بردار (معکوس به ابتدا) را برمیگرداند. این پیمایشگر از آخرین به اولین عنصر حرکت میکند.
- rend: یک پیمایشگر معکوس را که به عنصری تئوری پیش از اولین عنصر در بردار (به عنوان معکوس به انتها در نظر گرفتهشده است) اشاره میکند، برمیگرداند.
- cbegin: یک پیمایشگر ثابت که به اولین عنصر در بردار اشاره میکند، برمیگرداند.
- cend: یک پیمایشگر ثابت که به عنصری تئوری که آخرین عنصر در بردار اشاره میکند، برمیگرداند.
- crbegin: یک پیمایشگر معکوس ثابت که به آخرین عنصر در بردار (معکوس به ابتدا) اشاره میکند، برمیگرداند که از آخرین به اولین عنصر حرکت میکند.
- crend: یک پیمایشگر معکوس ثابت که به عنصر تئوری پیش از اولین عنصر در بردار (به عنوان معکوس به انتها در نظر گرفتهشده است) اشاره میکند را برمیگرداند.
قطعهکُد زیر استفاده از پیمایشگرها را نشان میدهد:
// C++ program to illustrate the // iterators in vector #include <iostream> #include <vector> using namespace std; int main() { vector<int> g1; for (int i = 1; i <= 5; i++) g1.push_back(i); cout << "Output of begin and end: "; for (auto i = g1.begin(); i != g1.end(); ++i) cout << *i << " "; cout << "\nOutput of cbegin and cend: "; for (auto i = g1.cbegin(); i != g1.cend(); ++i) cout << *i << " "; cout << "\nOutput of rbegin and rend: "; for (auto ir = g1.rbegin(); ir != g1.rend(); ++ir) cout << *ir << " "; cout << "\nOutput of crbegin and crend : "; for (auto ir = g1.crbegin(); ir != g1.crend(); ++ir) cout << *ir << " "; return 0; }
خروجی قطعهکُد بالا به این صورت است:
Output of begin and end: 1 2 3 4 5 Output of cbegin and cend: 1 2 3 4 5 Output of rbegin and rend: 5 4 3 2 1 Output of crbegin and crend : 5 4 3 2 1
ظرفیت (Capacity)
- size: تعداد عناصر در بردار را برمیگرداند.
- max_size: حداکثر تعداد عناصری که بردار میتواند نگهدارد را برمیگرداند.
- capacity: اندازهی فضای ذخیره فعلی تخصیصداده شده به بردار که به عنوان تعداد عناصر در نظر گرفتهشده است.
- resize: تغییراندازهی نگهدارنده به طوری که نگهدارنده شامل n عنصر باشد.
- empty: اینکه آیا نگهدارنده خالی است را برمیگرداند.
- shrink_to_fit: کاهش ظرفیت نگهدارنده برای متناسبکردن اندازهاش و تخریب همهی عناصر علاوهبر فضا.
- reserve: درخواست برای ظرفیت بردار که دستکم برای n عنصر کافی باشد.
قطعهکد زیر این موضوع را نشان میدهد:
// C++ program to illustrate the // capacity function in vector #include <iostream> #include <vector> using namespace std; int main() { vector<int> g1; for (int i = 1; i <= 5; i++) g1.push_back(i); cout << "Size : " << g1.size(); cout << "\nCapacity : " << g1.capacity(); cout << "\nMax_Size : " << g1.max_size(); // resizes the vector size to 4 g1.resize(4); // prints the vector size after resize() cout << "\nSize : " << g1.size(); // checks if the vector is empty or not if (g1.empty() == false) cout << "\nVector is not empty"; else cout << "\nVector is empty"; // Shrinks the vector g1.shrink_to_fit(); cout << "\nVector elements are: "; for (auto it = g1.begin(); it != g1.end(); it++) cout << *it << " "; return 0; }
خروجی قطعهکُد بالا به این صورت است:
Size : 5 Capacity : 8 Max_Size : 4611686018427387903 Size : 4 Vector is not empty Vector elements are: 1 2 3 4
دسترسی به عناصر
- reference operator [g]: یک مرجع به عنصر در موقعیت g در بردار برمیگرداند.
- at(g): یک مرجع به عنصر در موقعیت g در بردار برمیگرداند.
- front: یک مرجع به اولین عنصر در بردار برمیگرداند.
- back: یک مرجع به آخرین عنصر در بردار برمیگرداند.
- data: یک اشارهگر مستقیم را به آرایهی استفادهشده به صورت توکار توسط بردار که برای ذخیرهی عناصرش است، برمیگرداند.
قطعهکد زیر این موضوع را نشان میدهد:
// C++ program to illustrate the // element accesser in vector #include <bits/stdc++.h> using namespace std; int main() { vector<int> g1; for (int i = 1; i <= 10; i++) g1.push_back(i * 10); cout << "\nReference operator [g] : g1[2] = " << g1[2]; cout << "\nat : g1.at(4) = " << g1.at(4); cout << "\nfront() : g1.front() = " << g1.front(); cout << "\nback() : g1.back() = " << g1.back(); // pointer to the first element int* pos = g1.data(); cout << "\nThe first element is " << *pos; return 0; }
خروجی قطعهکُد بالا به این صورت است:
Reference operator [g] : g1[2] = 30 at : g1.at(4) = 50 front() : g1.front() = 10 back() : g1.back() = 100 The first element is 10
اصلاحکنندهها (Modifiers)
- assign: مقداری جدید را به عناصر بردار با جایگزین کردن موارد قدیمی تخصیص میدهد.
- push_back: عناصر را از عقب به درون یک بردار وارد میکند.
- pop_back: برای حذف عناصر از بردار از عقب استفاده میشود.
- insert: عناصر جدید را قبل از عنصر در موقعیت مشخصشده درج میکند.
- erase: برای حذف عناصر از نگهدارنده از موقعیت یا طیف مشخصشده استفاده میشود.
- swap: برای جابجایی محتوای یک بردار با بردار دیگر از یک نوع استفاده میشود. اندازهها ممکن است متفاوت باشند.
- clear: برای حذف همهی عناصر نگهدارندهی بردار استفاده میشود.
- emplace: با درج عنصر جدید در موقعیت، نگهدارنده را گسترش میدهد.
- emplace_back: برای درج عنصر جدید به درون نگهدارندهی بردار استفاده میشود که عنصر جدید به انتهای بردار اضافه میشود.
قطعهکد زیر این موضوع را نشان میدهد:
// C++ program to illustrate the // Modifiers in vector #include <bits/stdc++.h> #include <vector> using namespace std; int main() { // Assign vector vector<int> v; // fill the array with 10 five times v.assign(5, 10); cout << "The vector elements are: "; for (int i = 0; i < v.size(); i++) cout << v[i] << " "; // inserts 15 to the last position v.push_back(15); int n = v.size(); cout << "\nThe last element is: " << v[n - 1]; // removes last element v.pop_back(); // prints the vector cout << "\nThe vector elements are: "; for (int i = 0; i < v.size(); i++) cout << v[i] << " "; // inserts 5 at the beginning v.insert(v.begin(), 5); cout << "\nThe first element is: " << v[0]; // removes the first element v.erase(v.begin()); cout << "\nThe first element is: " << v[0]; // inserts at the beginning v.emplace(v.begin(), 5); cout << "\nThe first element is: " << v[0]; // Inserts 20 at the end v.emplace_back(20); n = v.size(); cout << "\nThe last element is: " << v[n - 1]; // erases the vector v.clear(); cout << "\nVector size after erase(): " << v.size(); // two vector to perform swap vector<int> v1, v2; v1.push_back(1); v1.push_back(2); v2.push_back(3); v2.push_back(4); cout << "\n\nVector 1: "; for (int i = 0; i < v1.size(); i++) cout << v1[i] << " "; cout << "\nVector 2: "; for (int i = 0; i < v2.size(); i++) cout << v2[i] << " "; // Swaps v1 and v2 v1.swap(v2); cout << "\nAfter Swap \nVector 1: "; for (int i = 0; i < v1.size(); i++) cout << v1[i] << " "; cout << "\nVector 2: "; for (int i = 0; i < v2.size(); i++) cout << v2[i] << " "; }
خروجی قطعهکُد بالا به این صورت است:
The vector elements are: 10 10 10 10 10 The last element is: 15 The vector elements are: 10 10 10 10 10 The first element is: 5 The first element is: 10 The first element is: 5 The last element is: 20 Vector size after erase(): 0 Vector 1: 1 2 Vector 2: 3 4 After Swap Vector 1: 3 4 Vector 2: 1 2