এই জাতীয় vector
বা অন্য কোনও প্রযোজ্য (পরিবর্তনযোগ্য ইনপুট পুনরায় বিভাজনকারী) প্রকারের কাস্টম অবজেক্টের পরিসর বাছাই X
করা বিভিন্ন পদ্ধতি ব্যবহার করে বিশেষত স্ট্যান্ডার্ড লাইব্রেরি অ্যালগরিদমের ব্যবহার সহ অর্জন করা যায়
যেহেতু বেশিরভাগ কৌশলগুলি, X
উপাদানগুলির আপেক্ষিক ক্রম অর্জনের জন্য ইতিমধ্যে পোস্ট করা হয়েছে, তাই আমি "কেন" এবং "কখন" বিভিন্ন পদ্ধতির ব্যবহারের জন্য কিছু নোট দিয়ে শুরু করব।
"সেরা" পদ্ধতির উপর নির্ভর করে বিভিন্ন কারণ:
X
বস্তুর সীমা বাছাই করা কি সাধারণ বা বিরল কাজ (এই ধরণের রেঞ্জগুলি প্রোগ্রামে বা লাইব্রেরি ব্যবহারকারীদের দ্বারা একাধিক পৃথক স্থানে বাছাই করা যাবে)?
- প্রয়োজনীয় বাছাই করা কি "প্রাকৃতিক" (প্রত্যাশিত) বা এই ধরণেরটিকে নিজের সাথে তুলনা করার একাধিক উপায় রয়েছে?
- কর্মক্ষমতা কি একটি সমস্যা বা
X
অবজেক্টের রেঞ্জকে বাছাই করা বোকা হওয়া উচিত ?
যদি রেঞ্জের সীমাবদ্ধকরণ X
একটি সাধারণ কাজ এবং অর্জিত বাছাই করা প্রত্যাশিত হয় (যেমন X
কেবলমাত্র একটি একক মৌলিক মানটি আবৃত করে) তবে সম্ভবত অতিরিক্ত লোডিংয়ের জন্য যেতে হবেoperator<
এটি কারণ এটি কোনও ঝাঁকুনি ছাড়াই বাছাই করতে সক্ষম করে (সঠিকভাবে সঠিক তুলনামূলক পাস করার মতো) এবং বারবার ফলন প্রত্যাশিত ফলাফল নেই।
যদি বাছাই একটি সাধারণ কাজ বা বিভিন্ন প্রসঙ্গে প্রয়োজন হতে পারে তবে একাধিক মানদণ্ড রয়েছে যা X
অবজেক্টগুলিকে সাজানোর জন্য ব্যবহার করা যেতে পারে , আমি ফান্টেক্টর ( operator()
কাস্টম ক্লাসগুলির ওভারলোডেড ফাংশন) বা ফাংশন পয়েন্টার (অর্থাত্ একটি ফান্টার / ফাংশন) যাব লেজিকাল অর্ডার করার জন্য এবং প্রাকৃতিক অর্ডারের জন্য অন্য একটি)।
X
অন্যান্য প্রসঙ্গে যদি প্রকারের শ্রেণি বাছাই করা অস্বাভাবিক বা সম্ভাবনা না থাকে তবে আমি আরও ফাংশন বা প্রকারের সাথে কোনও নেমস্পেসের বিশৃঙ্খলা না করে ল্যাম্বডাস ব্যবহার করি।
এটি বিশেষত সত্য যদি বাছাই কোনওভাবে "পরিষ্কার" বা "প্রাকৃতিক" না হয়। আপনি operator<
প্রথম দর্শনে ওপেন থাকাকালীন জায়গায় প্রয়োগ করা ল্যাম্বডায় তাকালে অর্ডারের পিছনে যুক্তিটি সহজেই পেতে পারেন এবং কী অর্ডারিং লজিক প্রয়োগ করা হবে তা জানতে আপনাকে সংজ্ঞাটি দেখতে হবে।
তবে খেয়াল করুন, একক operator<
সংজ্ঞা ব্যর্থতার একক পয়েন্ট যেখানে একাধিক ল্যাম্বাস ব্যর্থতার একাধিক পয়েন্ট এবং আরও সতর্কতার প্রয়োজন।
সংজ্ঞা থাকলে operator<
বাছাই সম্পন্ন যেখানে / সারণি টেমপ্লেট সংকলিত হয়েছে উপলব্ধ না হয় তবে কম্পাইলারটি বস্তুগুলির সাথে তুলনা করার সময় ক্রিয়াকলাপ করতে বাধ্য হতে পারে, ক্রমবর্ধমান ক্রম (কমপক্ষে যখন) লিঙ্ক টাইম অপ্টিমাইজেশন / কোড জেনারেশন প্রয়োগ করা হয়নি)।
class X
স্ট্যান্ডার্ড লাইব্রেরি বাছাইকরণ অ্যালগরিদম ব্যবহার করার জন্য তুলনামূলকতা অর্জনের উপায়
যাক std::vector<X> vec_X;
এবংstd::vector<Y> vec_Y;
1. ওভারলোড T::operator<(T)
বা operator<(T, T)
এবং স্ট্যান্ডার্ড লাইব্রেরি টেম্পলেটগুলি ব্যবহার করুন যা তুলনা ফাংশনটি আশা করে না।
হয় ওভারলোড সদস্য operator<
:
struct X {
int i{};
bool operator<(X const &r) const { return i < r.i; }
};
// ...
std::sort(vec_X.begin(), vec_X.end());
বা বিনামূল্যে operator<
:
struct Y {
int j{};
};
bool operator<(Y const &l, Y const &r) { return l.j < r.j; }
// ...
std::sort(vec_Y.begin(), vec_Y.end());
২. কাস্টম তুলনা ফাংশন সহ ফাংশন প্যারামিটার বাছাই হিসাবে কোনও ফাংশন পয়েন্টার ব্যবহার করুন।
struct X {
int i{};
};
bool X_less(X const &l, X const &r) { return l.i < r.i; }
// ...
std::sort(vec_X.begin(), vec_X.end(), &X_less);
৩. bool operator()(T, T)
একটি পছন্দসই ধরণের জন্য একটি ওভারলোড তৈরি করুন যা তুলনা ফান্টর হিসাবে পাস হতে পারে।
struct X {
int i{};
int j{};
};
struct less_X_i
{
bool operator()(X const &l, X const &r) const { return l.i < r.i; }
};
struct less_X_j
{
bool operator()(X const &l, X const &r) const { return l.j < r.j; }
};
// sort by i
std::sort(vec_X.begin(), vec_X.end(), less_X_i{});
// or sort by j
std::sort(vec_X.begin(), vec_X.end(), less_X_j{});
এই ফাংশন অবজেক্টের সংজ্ঞাগুলি সি ++ 11 এবং টেম্পলেটগুলি ব্যবহার করে কিছুটা জেনেরিক লেখা যেতে পারে:
struct less_i
{
template<class T, class U>
bool operator()(T&& l, U&& r) const { return std::forward<T>(l).i < std::forward<U>(r).i; }
};
যা সদস্য i
সমর্থন সহ যে কোনও ধরণের বাছাই করতে ব্যবহার করা যেতে পারে <
।
৪. বাছাইকরণের ক্রিয়াকলাপগুলির সাথে তুলনা করার প্যারামিটার হিসাবে একটি অজ্ঞাতনামা ক্লোজার (ল্যাম্বদা) পাস করুন।
struct X {
int i{}, j{};
};
std::sort(vec_X.begin(), vec_X.end(), [](X const &l, X const &r) { return l.i < r.i; });
যেখানে সি ++ 14 আরও বেশি জেনেরিক ল্যাম্বডা এক্সপ্রেশন সক্ষম করে:
std::sort(a.begin(), a.end(), [](auto && l, auto && r) { return l.i < r.i; });
যা ম্যাক্রোতে আবৃত হতে পারে
#define COMPARATOR(code) [](auto && l, auto && r) -> bool { return code ; }
সাধারণ তুলনামূলক তৈরিটি বেশ মসৃণ করে তোলে:
// sort by i
std::sort(v.begin(), v.end(), COMPARATOR(l.i < r.i));
// sort by j
std::sort(v.begin(), v.end(), COMPARATOR(l.j < r.j));