بخش‌بندی (Partition) در ++C

Partition in C Plus Plus

17 اردیبهشت 1401
Partition-in-C-Plus-Plus

++C یک کلاس در کتابخانه‌ی الگوریتم STL خودش دارد که به ما امکان بخش‌بندی کردن آسان الگوریتم‌ها را با استفاده از توابع داخلی خاص می‌دهد. Partition در C++ یا بخش‌بندی کردن، به عمل تقسیم عناصر نگه‌دارنده بسته به شرط ارائه‌شده، اشاره دارد.

عملیات بخش‌بندی یا Partition در C++:

  1.  partition(beg, end, condition): این تابع برای بخش‌بندی کردن عناصر بر اساس شرط اشاره‌شده در آرگومانت‌هایش استفاده می‌شود
  2.  is_partitioned(beg, end, condition): این تابع اگر نگه‌دارنده بخش‌بندی شده باشد، true و درغیر اینصورت false را برمی‌گرداند.
CPP
// C++ code to demonstrate the working of
// partition() and is_partitioned()
#include<iostream>
#include<algorithm> // for partition algorithm
#include<vector> // for vector
using namespace std;
int main()
{
    // Initializing vector
    vector<int> vect = { 2, 1, 5, 6, 8, 7 };
     
    // Checking if vector is partitioned
    // using is_partitioned()
    is_partitioned(vect.begin(), vect.end(), [](int x)
    {
        return x%2==0;
         
    })?
     
    cout << "Vector is partitioned":
    cout << "Vector is not partitioned";
    cout << endl;
     
    // partitioning vector using partition()
    partition(vect.begin(), vect.end(), [](int x)
    {
        return x%2==0;
         
    });
     
    // Checking if vector is partitioned
    // using is_partitioned()
    is_partitioned(vect.begin(), vect.end(), [](int x)
    {
        return x%2==0;
         
    })?
     
    cout << "Now, vector is partitioned after partition operation":
    cout << "Vector is still not partitioned after partition operation";
    cout << endl;
     
    // Displaying partitioned Vector
    cout << "The partitioned vector is : ";
    for (int &x : vect) cout << x << " ";
     
    return 0;
     
}

خروجی قطعه‌کُد بالا به این صورت است:

Vector is not partitioned
Now, vector is partitioned after partition operation
The partitioned vector is : 2 8 6 5 1 7

در قطعه‌کُد بالا، تابع partition، بردار را بسته به این‌که آیا یک عنصر زوج یا فرد است، بخش‌بندی می‌کند. عناصر زوج از عناصر فرد در هیچ ترتیبی خاصی بخش‌بندی شده‌اند.

3. stable_partition(beg, end, condition): این تابع برای بخش‌بندی عناصر بر اساس شرط اشاره‌شده در آرگومانت‌هایش استفاده شده است، به طوری که ترتیب عناصر نسبی رعایت شده است.

4.  partition_point(beg, end, condition): این تابع یک پیمایشگر را که به نقطه‌ی بخش‌بندی نگه‌دارنده اشاره می‌کند، برمی‌گرداند. به عنوان مثال، اولین عنصر در طیف بخش‌بندی شده [beg,end) به دلیل شرط درست نیست. نگه‌دارنده باید از قبل بخش‌بندی‌شده باشد، تا این تابع کار کند.

// C++ code to demonstrate the working of
// stable_partition() and partition_point()
#include<iostream>
#include<algorithm> // for partition algorithm
#include<vector> // for vector
using namespace std;
int main()
{
    // Initializing vector
    vector<int> vect = { 2, 1, 5, 6, 8, 7 };
     
    // partitioning vector using stable_partition()
    // in sorted order
    stable_partition(vect.begin(), vect.end(), [](int x)
    {
        return x%2 == 0;       
    });
     
    // Displaying partitioned Vector
    cout << "The partitioned vector is : ";
    for (int &x : vect) cout << x << " ";
    cout << endl;
     
    // Declaring iterator
    vector<int>::iterator it1;
     
    // using partition_point() to get ending position of partition
    auto it = partition_point(vect.begin(), vect.end(), [](int x)
    {
        return x%2==0;
    });
     
    // Displaying partitioned Vector
    cout << "The vector elements returning true for condition are : ";
    for ( it1= vect.begin(); it1!=it; it1++)
    cout << *it1 << " ";
    cout << endl;
     
    return 0;
     
}

خروجی قطعه‌کُد بالا به این صورت است:

The partitioned vector is : 2 6 8 1 5 7 
The vector elements returning true for condition are : 2 6 8

در قطعه‌کُد بالا، عناصر زوج و فرد بخش‌بندی شده‌اند و در ترتیبی صعودی مرتب‌شده‌اند. با این وجود همیشه در ترتیبی صعودی نیست، در اینجا عناصر (زوج و فرد)، در ترتیبی صعودی نشان‌داده شده‌اند که نتیجه‌ی بعد از بخش‌بندی نیز همین‌طور است. اگر vect که درواقع {2,1,7,8,6,5} بوده است، بعد از () stable_partition به {2,8,6,1,7,5} تبدیل خواهد شد. ترتیب حفظ‌شده است.

5. partition_copy(beg, end, beg1, beg2, condition): این تابع، عناصر بخش‌بندی‌شده را در نگه‌دارنده‌ی متفاوتِ اشاره‌شده در آرگومانت‌هایش کپی می‌کند و 5 آرگومانت دریافت می‌کند: موقعیت ابتدا و انتهای نگه‌دارنده، موقعیت ابتدای نگه‌دارنده‌ی جدید که عناصر باید کپی شوند (عناصر true را برای شرط برمی‌گرداند)، موقعیت ابتدای نگه‌دارنده‌ی جدید که دیگر عناصر باید کپی شوند (عناصر false را برای شرط برمی‌گرداند) و شرط. تغییر‌ اندازه نگه‌دارنده‌ی جدید نیز برای این تابع ضروری است.

// C++ code to demonstrate the working of
// partition_copy()
#include<iostream>
#include<algorithm> // for partition algorithm
#include<vector> // for vector
using namespace std;
int main()
{
    // Initializing vector
    vector<int> vect = { 2, 1, 5, 6, 8, 7 };
     
    // Declaring vector1
    vector<int> vect1;
     
    // Declaring vector1
    vector<int> vect2;
     
    // Resizing vectors to suitable size using count_if() and resize()
    int n = count_if (vect.begin(), vect.end(), [](int x)
    {
        return x%2==0;
         
    } );
    vect1.resize(n);
    vect2.resize(vect.size()-n);
     
    // Using partition_copy() to copy partitions
    partition_copy(vect.begin(), vect.end(), vect1.begin(),
                                     vect2.begin(), [](int x)
    {
        return x%2==0;
    });
     
     
    // Displaying partitioned Vector
    cout << "The elements that return true for condition are : ";
    for (int &x : vect1)
            cout << x << " ";
    cout << endl;
     
    // Displaying partitioned Vector
    cout << "The elements that return false for condition are : ";
    for (int &x : vect2)
            cout << x << " ";
    cout << endl;
     
    return 0;

خروجی قطعه‌کُد بالا به این صورت است:

The elements that return true for condition are : 2 6 8 
The elements that return false for condition are : 1 5 7

منبع: وب سایت geeksforgeeks

نویسنده شوید
دیدگاه‌های شما

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