গৃহীত উত্তরের প্রথম (ভাল-ভোট) মন্তব্যটি বিদ্যমান এসটি সেট সেট ক্রিয়াকলাপের জন্য নিখোঁজ অপারেটর সম্পর্কে অভিযোগ করে।
একদিকে, আমি স্ট্যান্ডার্ড লাইব্রেরিতে এ জাতীয় অপারেটরের অভাব বুঝতে পারি। অন্যদিকে, ইচ্ছা করলে এগুলি যুক্ত করা (ব্যক্তিগত আনন্দের জন্য) সহজ। আমি ওভারলোড করেছি
operator *()
সেট ছেদ জন্য
operator +()
সেট ইউনিয়নের জন্য।
নমুনা test-set-ops.cc
:
#include <algorithm>
#include <iterator>
#include <set>
template <class T, class CMP = std::less<T>, class ALLOC = std::allocator<T> >
std::set<T, CMP, ALLOC> operator * (
const std::set<T, CMP, ALLOC> &s1, const std::set<T, CMP, ALLOC> &s2)
{
std::set<T, CMP, ALLOC> s;
std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(),
std::inserter(s, s.begin()));
return s;
}
template <class T, class CMP = std::less<T>, class ALLOC = std::allocator<T> >
std::set<T, CMP, ALLOC> operator + (
const std::set<T, CMP, ALLOC> &s1, const std::set<T, CMP, ALLOC> &s2)
{
std::set<T, CMP, ALLOC> s;
std::set_union(s1.begin(), s1.end(), s2.begin(), s2.end(),
std::inserter(s, s.begin()));
return s;
}
#include <iostream>
using namespace std;
template <class T>
ostream& operator << (ostream &out, const set<T> &values)
{
const char *sep = " ";
for (const T &value : values) {
out << sep << value; sep = ", ";
}
return out;
}
int main()
{
set<int> s1 { 1, 2, 3, 4 };
cout << "s1: {" << s1 << " }" << endl;
set<int> s2 { 0, 1, 3, 6 };
cout << "s2: {" << s2 << " }" << endl;
cout << "I: {" << s1 * s2 << " }" << endl;
cout << "U: {" << s1 + s2 << " }" << endl;
return 0;
}
সংকলিত এবং পরীক্ষিত:
$ g++ -std=c++11 -o test-set-ops test-set-ops.cc
$ ./test-set-ops
s1: { 1, 2, 3, 4 }
s2: { 0, 1, 3, 6 }
I: { 1, 3 }
U: { 0, 1, 2, 3, 4, 6 }
$
আমি যা পছন্দ করি না তা হ'ল অপারেটরগুলিতে রিটার্ন মানগুলির অনুলিপি। হতে পারে, সরানো অ্যাসাইনমেন্ট ব্যবহার করে এটি সমাধান করা যেতে পারে তবে এটি এখনও আমার দক্ষতার বাইরে।
এই "নতুন অভিনব" মুভ শব্দার্থবিজ্ঞান সম্পর্কে আমার সীমিত জ্ঞানের কারণে, আমি অপারেটর রিটার্ন সম্পর্কে উদ্বিগ্ন ছিল যার ফলে ফিরে আসা সেটগুলির অনুলিপি হতে পারে। ওলাফ ডিয়েটশে উল্লেখ করেছিলেন যে এই উদ্বেগগুলি অপ্রয়োজনীয় কারণ std::set
ইতিমধ্যে মুভ কনস্ট্রাক্টর / অ্যাসাইনমেন্ট সহ সজ্জিত।
যদিও আমি তাকে বিশ্বাস করি, আমি কীভাবে এটি পরীক্ষা করে দেখতে হবে ("আত্মবিশ্বাসের মতো কিছু" এর জন্য) ভাবছিলাম। আসলে, এটি বেশ সহজ। উত্স কোডে টেমপ্লেটগুলি সরবরাহ করতে হবে, আপনি কেবল ডিবাগার দিয়ে পদক্ষেপ নিতে পারেন। সুতরাং, আমি ডান দিকে একটি বিরতি বিন্দু স্থাপন return s;
এর operator *()
এবং একক-পদক্ষেপ যা আমার মধ্যে অবিলম্বে leaded সঙ্গে রইল std::set::set(_myt&& _Right)
: এবং ভিওলা - পদক্ষেপ কন্সট্রাকটর। ধন্যবাদ, ওলাফ, (আমার) আলোকপাতের জন্য।
সম্পূর্ণতার স্বার্থে, আমি সংশ্লিষ্ট এসাইনমেন্ট অপারেটরগুলিও কার্যকর করেছিলাম
operator *=()
সেটগুলির "ধ্বংসাত্মক" ছেদ জন্য
operator +=()
সেটগুলির "ধ্বংসাত্মক" ইউনিয়নের জন্য।
নমুনা test-set-assign-ops.cc
:
#include <iterator>
#include <set>
template <class T, class CMP = std::less<T>, class ALLOC = std::allocator<T> >
std::set<T, CMP, ALLOC>& operator *= (
std::set<T, CMP, ALLOC> &s1, const std::set<T, CMP, ALLOC> &s2)
{
auto iter1 = s1.begin();
for (auto iter2 = s2.begin(); iter1 != s1.end() && iter2 != s2.end();) {
if (*iter1 < *iter2) iter1 = s1.erase(iter1);
else {
if (!(*iter2 < *iter1)) ++iter1;
++iter2;
}
}
while (iter1 != s1.end()) iter1 = s1.erase(iter1);
return s1;
}
template <class T, class CMP = std::less<T>, class ALLOC = std::allocator<T> >
std::set<T, CMP, ALLOC>& operator += (
std::set<T, CMP, ALLOC> &s1, const std::set<T, CMP, ALLOC> &s2)
{
s1.insert(s2.begin(), s2.end());
return s1;
}
#include <iostream>
using namespace std;
template <class T>
ostream& operator << (ostream &out, const set<T> &values)
{
const char *sep = " ";
for (const T &value : values) {
out << sep << value; sep = ", ";
}
return out;
}
int main()
{
set<int> s1 { 1, 2, 3, 4 };
cout << "s1: {" << s1 << " }" << endl;
set<int> s2 { 0, 1, 3, 6 };
cout << "s2: {" << s2 << " }" << endl;
set<int> s1I = s1;
s1I *= s2;
cout << "s1I: {" << s1I << " }" << endl;
set<int> s2I = s2;
s2I *= s1;
cout << "s2I: {" << s2I << " }" << endl;
set<int> s1U = s1;
s1U += s2;
cout << "s1U: {" << s1U << " }" << endl;
set<int> s2U = s2;
s2U += s1;
cout << "s2U: {" << s2U << " }" << endl;
return 0;
}
সংকলিত এবং পরীক্ষিত:
$ g++ -std=c++11 -o test-set-assign-ops test-set-assign-ops.cc
$ ./test-set-assign-ops
s1: { 1, 2, 3, 4 }
s2: { 0, 1, 3, 6 }
s1I: { 1, 3 }
s2I: { 1, 3 }
s1U: { 0, 1, 2, 3, 4, 6 }
s2U: { 0, 1, 2, 3, 4, 6 }
$