الگوریتمستان

برنامه‌نویسی، طراحی الگوریتم و حل مسئله‌های الگوریتمی

 
در صورت ناخوانا بودن نوشته‌ها، از مرورگر دیگری استفاده کنید.
نکته‌ای در مورد کلاس‌ها و مجموعه‌ها در ++C - الگوریتمستان
الگوریتمستان
  »  

نکته‌ای در مورد کلاس‌ها و مجموعه‌ها در ++C

        بررسی روش تعریف کلاس برای قابلیت استفاده از ظرف‌های مجموعه (set و unordered_set) در زبان برنامه‌نویسی ++C

زبان برنامه‌نویسی ++C دو کلاس set و unordered_set رو برای پیاده‌سازی مفهوم مجموعه (ظرفی با عناصر غیرتکراری) داره.

کلاس set علاوه بر بررسی تکراری نبودن عناصر، اونها رو به صورت مرتب ذخیره می‌کنه. پس اگر بخوایم برای نگه داشتن عناصری از کلاس دلخواه خودمون از set استفاده کنیم، باید حداقل عملگر > رو سربارگذاری کرده باشیم تا ظرف set قابلیت تشخیص ترتیب عناصر رو داشته باشه. اما گاهی تعریف کوچکتر بودن برای کلاسمون مقدور نیست یا از لحاظ مفهومی معنی نداره. در چنین شرایطی می‌تونیم از کلاس unordered_set استفاده کنیم.

کلاس unordered_set از hashing برای بررسی یکسان بودن عناصر استفاده می‌کنه. بنابراین باید عملکرد hash برای کلاس دلخواه خودمون رو تعریف کنیم. اما طراحی عملگر hash کارا و بدون تداخل لزوما راحت نیست و ممکن‌ه عناصر متفاوت، hash یکسانی رو تولید کنن. به همین دلیل علاوه بر پیاده‌سازی متد hash باید عملگر == هم پیاده شه تا در صورت برابر بودن hash دو عنصر، یکسان بودن اون دو از طریق عملگر == هم بررسی شه. این کار یک حسن بزرگ داره که لازم نیست درگیر طراحی hash دقیق و بدون تداخل باشیم و حتی اگر تداخلی داشتیم، عملگر == هم برای تشخیص تمایز فراخوانی می‌شه.

  

class Circle {
public:
    double radius;
    Circle(double r) {
        this->radius = r;
    }
    bool operator < (const Circle& l) const {
        return this->radius < l.radius;
    }
10 };
11 class Rectangle {
12 public:
13     double width, height;
14   
15     Rectangle(double w, double h) {
16         this->width = w;
17         this->height = h;
18     }
19   
20     bool operator == (const Rectangle& l) const {
21         return this->width == l.width && this->height == l.height;
22     }
23   
24     size_t hash() const {
25         return 2 * this->width + 3 * this->height;
26     }
27 };
28   
29 namespace std {
30     template <>
31     struct hash<Rectangle> {
32         size_t operator () (const Rectangle &r) const { return r.hash(); }
33     };
34 }
35   
36 int main() {
37     std::set<Circle> cc;
38     cc.insert(Circle(20));
39     cc.insert(Circle(10));
40     for(auto c : cc)
41         std::cout << c.radius << std::endl;
42     std::unordered_set<Rectangle> rr;
43     rr.insert(Rectangle(6, 2));
44     rr.insert(Rectangle(3, 4));
45     for(auto r : rr)
46         std::cout << r.width << "\t" << r.height << std::endl;
47     return 0;
48 }
به اشتراک‌گذاری نوشته
اشتراک‌گذاری در LinkedIn     Cloob     اشتراک‌گذاری در Twitter     اشتراک‌گذاری در Facebook     ارسال با Telegram     Google Plus
برچسب‌ها
امتیاز نوشته
  • 1
  • 2
  • 3
  • 4
  • 5

نام: *  

پست الکترونیک:

وبگاه:

متن پیام: *

01 02 03 04 05 06 07 08 09 10 11 12 13 14

 


الگوریتمستان در تلگرام

   

   

پیوند کوتاه: عمر نوشته:  ۵۰۶ روز
تعداد بازدید:  ۷۸۷ بازدید
تعداد امتیاز:  ۱ امتیاز
میانگین امتیاز:  ۴.۰۰  از  ۵.۰۰
»  بازی Lights Out و ریاضیات دوست داشتنی
        حل بازی Lights Out با ریاضیات دوست داشتنی
»  سوال Free Ticket
        راهنمای حل سوال Free ticket، از سوالات المپیاد ملی کامپیوتر هندوستان
»  sync_with_stdio در زبان ++C
        نکته‌ای در مورد کارایی عملیات ورودی و خروجی در زبان برنامه‌نویسی ++C و عملکرد تابع sync_with_stdio
»  نکته‌ای در محاسبه‌ی زمان اجرای کد
        در مورد تفاوت توابع clock و time در زبان برنامه‌نویسی ++C برای محاسبه‌ی زمان اجرای برنامه
»  ابزار VJudge
        معرفی وب‌سایت Virtual Judge برای برگزاری مجازی مسابقه‌ی برنامه‌نویسی به سبک مسابقات ACM-ICPC
»  هدر فایل bits/stdc++.h
        معرفی هدرفایل bits/stdc++.h برای کاهش زمان آماده شدن کد مسابقات برنامه‌نویسی
»  نکته‌ای از مسأله‌ی Graphical Editor
        استفاده از stringstream در حل سوالات مسابفات برنامه‌نویسی با زبان برنامه‌نویسی ++C
»  ابزار UVA Toolkit
        معرفی وب‌سایت UVA Toolkit برای کمک به حل سوالات برنامه‌نویسی UVA Online Judge
»  نکته‌ای از مسأله‌ی LC-Display
        نکته‌ای در باب روش ذخیره کردن ورودی یک مسأله
»  تابع popen
        روش اجرای برنامه‌ای دیگر داخل کد ++C و استفاده از خروجی آن
»  بازی TicTacToe
        پروژه‌ی بازی TicTacToe با زبان برنامه‌نویسی ++C و Qt
»  ظرف‌ها در ++C
        معرفی انواع ظرف‌ها (نگهدارنده‌ها - containers) در زبان برنامه‌نویسی ++C
»  سینوس و کسینوس را قورت بده
        محاسبه‌ی جدولی سینوس و کسینوس زوایای مشهور
»  نکته‌ای در استفاده از map
        نکته‌ای در مورد استفاده از ساختمان داده‌ی map با مثالی به زبان برنامه‌نویسی ++C