سؤال

أنا أعمل على نظام أحتاج إلى أن أكون قادرًا على فرز متجه عن طريق مسند معين ، والذي لا ينبغي أن يكون لدى فصولي السيطرة عليها. في الأساس ، أمررهم فئة مشتقة وفرزها بشكل أعمى.

كواحد من "المراوغات المبهجة" ، أحد أنماط الفرز هو ترتيب الدخول. هذا ما لدي حتى الآن.

struct Strategy
{
   virtual bool operator()(const Loan& lhs, const Loan& rhs) const = 0;
};

struct strategyA : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return true;
   }
};

struct strategyB : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return lhs.getID() > rhs.getID();
   }
};

struct strategyC : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return lhs.getFee() > rhs.getFee();
   }
};

من الواضح ، نظرًا لأن الإستراتيجية انعكاس ، لا يمكن استخدامها ، وإذا قمت بتعيينه على خطأ ، فسوف يتعامل مع كل شيء على قدم المساواة ويمكنني تقبيل وعيدي.

إذن هذا سؤالي. هل هناك طريقة لتحديد وظيفة مسند لفرز ناقل لن يغير أي شيء؟

أدرك أن أبسط الحلول هو إضافة ترتيب متغير الدخول إلى فئة القرض ، أو شريكه مع واحد في زوج. بدلاً من ذلك ، يمكنني إطعام المعلمة مع المسند الذي يخبر الفارز ما إذا كنت تريد استخدامه أم لا.

هل كانت مفيدة؟

المحلول

أنا شخصياً أعتقد أن فصل استراتيجيتك يجب أن يكون له طريقة "فرز". وبهذه الطريقة ، يمكن إما استدعاء std :: الفرز أم لا ، كما ترى مناسبة. سواء وكذلك كيف يصبح جزء من استراتيجية الفرز.

Darios stable_sort الإجابة جيدة جدًا ، إذا كنت تستطيع استخدامها.

من الممكن القيام بالفرز استنادًا إلى موضع العنصر في ناقل ، لكن هذا لا يعني أن العناصر لن تتحرك (العديد من خوارزميات الفرز سوف تتدافع بشكل أساسي عن بياناتك) ، لذلك يجب أن يكون لديك بعض الطرق الموثوقة لتحديد حيث كانت العناصر عندما بدأت.

من الممكن للمقارنة الاحتفاظ برسم خرائط للمواقع الحالية إلى الوضع الأصلي ، ولكن الكثير من العمل. من الناحية المثالية ، يجب أن يكون المنطق مدمجًا في خوارزمية الفرز - وليس فقط المقارنة - وهذا هو في الأساس كيفية عمل مستقر.

مشكلة أخرى - اعتمادًا على الحاوية - لا يعد ترتيب عناوين العناصر (SAIR) دائمًا ترتيب العناصر.

نصائح أخرى

هل هناك طريقة لتحديد وظيفة مسند لفرز ناقل لن يغير أي شيء؟

ذلك يعتمد على الخوارزمية. إذا كان النوع الخاص بك هو نوع مستقر, ، لن يتم تغيير ترتيب العناصر "المتساوية" (وهو غير محدد للأنواع غير المستقرة).

فكر في استخدام std::stable_sort.

إذا كان مجرد متجه تتحدث عنه ، فربما يمكنك الابتعاد عن توفير واجهة تحدد ما إذا كان ينبغي عليك الفرز أم لا. المتجهات ليست حاوية مرتبة ، لذلك تحتاج إلى فرزها بشكل صريح. فقط لا ترسلهم على الإطلاق.

لا توجد وظيفة فرز من شأنها أن تبقي ترتيب العناصر بناءً على قيم العناصر فقط. تحتاج إلى توفير المزيد من المعلومات لك Strategy, ، إن كان من الممكن.

قد يكون هناك نهج مختلف هو إحضار دلالات بياناتك إلى الحاوية. فكر في استخدام Boost :: Multi_index لطرق مختلفة للوصول والطلب على نفس البيانات:

http://www.boost.org/doc/libs/1_42_0/libs/multi_index/doc/index.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top