بردار یا Vector در کتابخانه‌ی STL در ++C

Vector in C Plus Plus STL

11 اردیبهشت 1401
Vector-in-C-Plus-Plus-STL

در این قسمت از آموزش کتابخانه‌ی الگوی استاندارد یا STL به بحث درمورد نگه‌دارنده‌ی vector (بردار) خواهیم پرداخت.

بردار‌ها (vectors) شبیه به آرایه‌های پویا هستند با این قابلیت که زمانی که یک عنصر، درج یا حذف می‌شود، به‌طور خودکار تغییر‌اندازه‌ می‌دهند که توسط نگه‌دارنده به طور خودکار محل ذخیره‌سازیشان مدیریت می‌شود. عناصر بردار (vector) به طور پیوسته ذخیره می‌شوند، به طوری که آن‌ها می‌توانند با استفاده از پیمایشگر‌ها، پیمایش و در دسترس قرار گیرند.

در بردار‌ها، داده‌ها در انتهای بردار درج می‌شود. درج کردن در انتهای بردار زمان متفاوتی می‌گیرد. گاهی اوقات ممکن است نیاز به گسترش آرایه باشد. حذف کردن عنصر آخر، زمان ثابتی را می‌گیرد، چرا که هیچ تغییر‌اندازه‌ای اتفاق نمی‌افتد. درج کردن و پاک‌کردن در ابتدا یا در وسط بردار در زمان خطی است.

توابع خاص مربوط با بردار به این صورت هستند:

پیمایشگر‌ها (Iterators)

  1. begin: یک پیمایشگر‌ که به اولین عنصر در بردار اشاره می‌کند، برمی‌گرداند.
  2. end: یک پیمایشگر که به عنصری تئوری که آخرین عنصر در بردار را دنبال می‌کند، اشاره می‌کند.
  3. rbegin: یک پیمایشگر معکوس که آخرین عنصر در بردار (معکوس به ابتدا) را برمی‌گرداند. این پیمایشگر از آخرین به اولین عنصر حرکت می‌کند.
  4. rend: یک پیمایشگر معکوس را که به عنصری تئوری پیش از اولین عنصر در بردار (به عنوان معکوس به انتها در نظر گرفته‌شده است) اشاره می‌کند، برمی‌گرداند.
  5. cbegin: یک پیمایشگر ثابت که به اولین عنصر در بردار اشاره می‌کند، برمی‌گرداند.
  6. cend: یک پیمایشگر ثابت که به عنصری تئوری که آخرین عنصر در بردار اشاره می‌کند، برمی‌گرداند.
  7. crbegin: یک پیمایشگر معکوس ثابت که به آخرین عنصر در بردار (معکوس‌ به ابتدا) اشاره‌ می‌کند، برمی‌گرداند که از آخرین به اولین عنصر حرکت می‌کند.
  8. 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) 

  1. size: تعداد عناصر در بردار را برمی‌گرداند.
  2. max_size: حداکثر تعداد عناصری که بردار می‌تواند نگه‌دارد را برمی‌گرداند.
  3. capacity: اندازه‌ی فضای ذخیره فعلی تخصیص‌داده شده به بردار که به عنوان تعداد عناصر در نظر گرفته‌شده است.
  4. resize: تغییر‌اندازه‌ی نگه‌دارنده به طوری که نگه‌دارنده‌ شامل n عنصر باشد.
  5. empty: این‌که آیا نگه‌دارنده خالی است را برمی‌گرداند.
  6. shrink_to_fit: کاهش ظرفیت نگه‌دارنده برای متناسب‌کردن اندازه‌اش و تخریب همه‌ی عناصر علاوه‌بر فضا.
  7. 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

دسترسی به عناصر

  1. reference operator [g]: یک مرجع به عنصر در موقعیت g در بردار برمی‌گرداند.
  2. at(g): یک مرجع به عنصر در موقعیت g در بردار برمی‌گرداند.
  3. front: یک مرجع به اولین عنصر در بردار برمی‌گرداند.
  4. back: یک مرجع به آخرین عنصر در بردار برمی‌گرداند.
  5. 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)

  1. assign: مقداری جدید را به عناصر بردار با جایگزین کردن موارد قدیمی تخصیص می‌دهد.
  2. push_back: عناصر را از عقب به درون یک بردار وارد می‌کند.
  3. pop_back: برای حذف عناصر از بردار از عقب استفاده می‌شود.
  4. insert: عناصر جدید را قبل از عنصر در موقعیت مشخص‌شده درج می‌کند.
  5. erase: برای حذف عناصر از نگه‌دارنده از موقعیت‌ یا طیف مشخص‌شده استفاده می‌شود.
  6. swap: برای جابجایی محتوای یک بردار با بردار دیگر از یک نوع استفاده می‌شود. اندازه‌ها ممکن است متفاوت باشند.
  7. clear: برای حذف همه‌ی عناصر نگه‌دارنده‌ی بردار استفاده می‌شود.
  8. emplace: با درج عنصر جدید در موقعیت، نگه‌دارنده را گسترش می‌دهد.
  9. 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
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.