++C یک کلاس در کتابخانهی الگوریتم STL خودش دارد که به ما امکان بخشبندی کردن آسان الگوریتمها را با استفاده از توابع داخلی خاص میدهد. Partition در C++ یا بخشبندی کردن، به عمل تقسیم عناصر نگهدارنده بسته به شرط ارائهشده، اشاره دارد.
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
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.