تجربه‌های پراکنده‌ی یک مسعود
در صورت ناخوانا بودن نوشته‌ها، از مرورگر دیگری استفاده کنید.

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

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

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

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

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

      

 1  class Circle {
 2  public:
 3      double radius;
 4      Circle(double r) {
 5          this->radius = r;
 6      }
 7      bool operator < (const Circle& l) const {
 8          return this->radius < l.radius;
 9      }
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  }


امتیاز نوشته
  • 1
  • 2
  • 3
  • 4
  • 5
ارسال پیام

نام: *  

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

وبگاه:

متن پیام: *

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

 

سوال:   دو چهار  تا؟    (عدد) تا