عملیات‌های ادغام (Merge operations) با استفاده از STL در ++C

Merge operations in C Plus Plus

19 اردیبهشت 1401
Merge-operations-in-C-Plus-Plus

برخی از کلاس‌های عملیات ادغام در STL در ++C تحت هِدر‌فایل algorithm فراهم شده‌اند، که عملیات‌های ادغام مختلف را در روشی ساده، آسان کرده است. در زیر به برخی از آن‌ها اشار‌ه‌شده است.

  1. merge(beg1, end1, beg2, end2, beg3): این تابع 2 نگه‌دارنده‌ی مرتب‌شده را ادغام و در یک نگه‌دارنده‌ی جدید به ترتیبی مرتب شده (ادغام مرتب) ذخیره می‌کند که 5 آرگومانت دریافت می کند: اولین و آخرین پیمایشگر اولین نگه‌دارنده، اولین و آخرین پیمایشگر دومین نگه‌دارنده و اولین پیمایشگر نگه‌دارنده‌ی به دست‌آمده.
  2. includes(beg1, end1, beg2, end2): این تابع برای بررسی این‌که آیا عناصر یک نگه‌دارنده‌ی مرتب‌شده شامل عناصر نگه‌دارنده‌ی مرتب‌شده‌ی دیگری هستند یا نه بکار می‌رود. اگر اولین نگه‌دارنده شامل دومین نگه‌دارنده باشد، true را برمی‌گرداند، درغیر اینصورت false را برمی‌گرداند.

قطعه‌کُد زیر کارکرد دو تابع بالا را نشان می‌دهد:

// C++ code to demonstrate the working of
// merge() and include()
#include<iostream>
#include<algorithm> // merge operations
#include<vector> // for vector
using namespace std;
int main()
{
 // Initializing 1st vector
 vector<int> v1 = {1, 3, 4, 5, 20, 30};
     
 // Initializing 2nd vector
 vector<int> v2 = {1, 5, 6, 7, 25, 30};
     
 // Declaring resultant vector
 // for merging
 vector<int> v3(12);
     
 // Using merge() to merge vectors v1 and v2
 // and storing result in v3
 merge(v1.begin(), v1.end(), v2.begin(),
                   v2.end(), v3.begin());
     
 // Displaying resultant container
 cout << "The new container after merging is :\n";
 for (int &x : v3)
     cout << x << " ";
 cout << endl;
  
 // Initializing new vector
 vector<int> v4 = {1, 3, 4, 5, 6, 20, 25, 30};
  
 // Using include() to check if v4 contains v1
 includes(v4.begin(), v4.end(), v1.begin(), v1.end())?
        cout << "v4 includes v1":
        cout << "v4 does'nt include v1";
  
 return 0;   
}

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

The new container after merging is :
1 1 3 4 5 5 6 7 20 25 30 30 
v4 includes v1

3. inplace_merge(beg1, beg2, end): این تابع برای مرتب‌کردن 2 طیف مرتب‌شده قرار‌گرفته به طور‌متوالی در تنها یک نگه‌دارنده استفاده می‌شود که 3 آرگومانت دریافت می‌کند: پیمایشگر به ابتدای اولین طیف مرتب‌شده، پیمایشگر به ابتدای دومین طیف مرتب‌شده و پیمایشگر به موقعیت آخر.

// C++ code to demonstrate the working of
// inplace_merge()
#include<iostream>
#include<algorithm> // merge operations
#include<vector> // for vector
using namespace std;
int main()
{
  
 // Initializing 1st vector
 vector<int> v1 = {1, 3, 4, 5, 20, 30};
     
 // Initializing 2nd vector
 vector<int> v2 = {1, 5, 6, 7, 25, 30};
     
 // Declaring resultant vector
 // for inplace_merge()
 vector<int> v3(12);
  
 // using copy to copy both vectors into
 // one container
 auto it = copy(v1.begin(), v1.end(), v3.begin());
 copy(v2.begin(), v2.end(), it);
  
 // Using inplace_merge() to sort the container
 inplace_merge(v3.begin(),it,v3.end());
     
 // Displaying resultant container
 cout << "The new container after inplace_merging is :\n";
 for (int &x : v3)
     cout << x << " ";
 cout << endl;
 
 return 0;
     
}

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

The new container after inplace_merging is :
1 1 3 4 5 5 6 7 20 25 30 30

4. set_union(beg1, end1, beg2, end2, beg3): این تابع مجموع اجتماع 2 نگه‌دارنده را محاسبه و در نگه‌دارنده‌ی جدید ذخیره می‌کند که پیمایشگری به آخرین عنصر از نگه‌دارنده‌ی بدست‌آمده را برمی‌گرداند و 5 آرگومانت دریافت می‌‌‌کند: آولین و آخرین پیمایشگر اولین نگه‌‌دارنده، اولین و آخرین نگه‌دارنده‌ی پیمایشگر دومین نگه‌دارنده و اولین پیمایشگر نگه‌دارنده‌ی بدست‌آمده. نگه‌دارنده‌ها باید مرتب‌شده باشند و لازم است که نگه‌دارنده‌ی جدید به اندازه‌ی مناسب، تغییر‌اندازه دهد.

5. set_intersection(beg1, end1, beg2, end2, beg3): این تابع مجموع اشتراک 2 نگه‌دارنده را محاسبه و در یک نگه‌دارنده‌ی جدید ذخیره می‌کند. این تابع  پیمایشگری به آخرین عنصر نگه‌دارنده بدست‌آمده را برمی‌گرداند که 5 آرگومانت دریافت می‌کند: اولین و آخرین پیمایشگر اولین نگه‌دارنده، اولین و آخرین پیمایشگر دومین نگه‌دارنده و اولین پیمایشگر نگه‌دارنده‌ی بدست‌آمده. نگه‌دارنده‌ها باید مرتب‌شده باشند و لازم است که نگه‌دارنده‌ی جدید به اندازه‌ی مناسب، تغییر‌اندازه دهد. یک روش برای پیاده‌سازی set-union و set-intersection در طیف‌های مرتب‌شده در اینجا می‌تواند یافت شود.

// C++ code to demonstrate the working of
// set_union() and set_intersection()
#include<iostream>
#include<algorithm> // for merge operations
#include<vector> // for vector
using namespace std;
int main()
{
 // Initializing 1st vector
 vector<int> v1 = {1, 3, 4, 5, 20, 30};
     
 // Initializing 2nd vector
 vector<int> v2 = {1, 5, 6, 7, 25, 30};
     
 // Declaring resultant vector
 // for union
 vector<int> v3(10);
     
 // Declaring resultant vector
 // for intersection
 vector<int> v4(10);
     
 // using set_union() to compute union  of 2
 // containers v1 and v2 and store result in v3
 auto it = set_union(v1.begin(), v1.end(), v2.begin(),
                              v2.end(), v3.begin());
     
 // using set_intersection() to compute intersection
 // of 2 containers v1 and v2 and store result in v4
 auto it1 = set_intersection(v1.begin(),v1.end(),
               v2.begin(), v2.end(), v4.begin());
     
 // resizing new container
 v3.resize(it - v3.begin());
     
 // resizing new container
 v4.resize(it1 - v4.begin());
     
 // Displaying set union
 cout << "Union of two containers is : ";
 for (int &x : v3)
     cout << x << " ";
 cout << endl;
     
 // Displaying set intersection
 cout << "Intersection of two containers is : ";
 for (int &x : v4)
     cout << x << " ";
 cout << endl;
     
 return 0;   
}

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

Union of two containers is : 1 3 4 5 6 7 20 25 30 
Intersection of two containers is : 1 5 30

6. set_difference(beg1, end1, beg2, end2, beg3): این تابع مجموعه‌ی متفاوت 2 نگه‌دارنده را محاسبه و در نگه‌دارنده‌ی جدید ذخیره می‌کند. این تابع پیمایشگر به آخرین عنصر از نگه‌دارنده‌ی بدست‌آمده را برمی‌گرداند که 5 آرگومانت دریافت می‌کند: اولین و آخرین پیمایشگر از اولین‌نگه‌دارنده، اولین و آخرین پیمایشگر از دومین نگه‌دارنده و اولین پیمایشگر از نگه‌دارنده‌ی بدست‌آمده. نگه‌دارنده‌ها باید مرتب‌شده باشند و لازم است که نگه‌‌دارند‌ه‌ی جدید به اندازه‌ی مناسب، تغییر‌اندازه دهد.

7. set_symmetric_difference(beg1, end1, beg2, end2, beg3): این تابع مجموع متقارن 2 نگه‌دارنده‌ی متفاوت را محاسبه و  در یک نگه‌دارنده‌ی جدید ذخیره می‌کند. این تابع پیمایشگر به آخرین عنصر از نگه‌دارنده‌ی بدست‌آمده را برمی‌گرداند که 5 آرگومانت دریافت می‌کند: اولین و آخرین پیمایشگر از اولین نگه‌دارنده، اولین و آخرین پیمایشگر از دومین نگه‌دارنده و اولین پیمایشگر از نگه‌دارنده‌ی بدست‌آمده. نگه‌دارنده‌ها باید مرتب‌شده باشند و لازم است که نگه‌دارنده‌ی جدید به انداز‌ه‌ی مناسب، تغییر‌اندازه دهد.

// C++ code to demonstrate the working of
// set_difference() and set_symmetric_difference()
#include<iostream>
#include<algorithm> // for merge operations
#include<vector> // for vector
using namespace std;
int main()
{
 // Initializing 1st vector
 vector<int> v1 = {1, 3, 4, 5, 20, 30};
     
 // Initializing 2nd vector
 vector<int> v2 = {1, 5, 6, 7, 25, 30};
     
 // Declaring resultant vector
 // for difference
 vector<int> v3(10);
     
 // Declaring resultant vector
 // for symmetric_difference
 vector<int> v4(10);
     
     
 // using set_difference() to compute difference
 // of 2 containers v1 and v2.
 auto it = set_difference(v1.begin(), v1.end(),
              v2.begin(), v2.end(), v3.begin());
     
 // using set_symmetric_difference() to compute
 // symmetric_difference/ of 2 containers
 auto it1 = set_symmetric_difference(v1.begin(),
       v1.end(), v2.begin(), v2.end(), v4.begin());
     
 // resizing new container
 v3.resize(it - v3.begin());
     
 // resizing new container
 v4.resize(it1 - v4.begin());
     
 // Displaying set difference
 cout << "Difference of two containers is : ";
 for (int &x : v3)
     cout << x << " ";
 cout << endl;
     
 // Displaying set symmetric_difference
 cout << "symmetric_difference of two containers is : ";
 for (int &x : v4)
     cout << x << " ";
 cout << endl;
     
 return 0;   
}

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

Difference of two containers is : 3 4 20 
Symmetric difference of two containers is : 3 4 6 7 20 25

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

نویسنده شوید

دیدگاه‌های شما

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