سؤال

لدي مشكلة في الحصول عليها boost::multi_index_container العمل مع الوصول العشوائي ومع orderd_unique في نفس الوقت. (أنا آسف للسؤال الطويل، لكنني أعتقد أنني يجب أن أستخدم مثالا ..)

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

class intermediate_result
{
private:
    std::vector<int>   parts;     // which parts are produced
    int                used_time; // how long did it take to produce

    ValueType          max_value; // how much is it worth
};

المتجه parts DeScibes، التي يتم إنتاج الكائنات (طولها N وهي أصغر من طراز Licricographically ثم CoreSp Cand-Vector!) - لكل نوع من هذا النوع الذي أعرفه use_time كذلك. بالإضافة إلى ذلك، أحصل على قيمة لهذا المتجهات من الكائنات المنتجة.

حصلت على قيد آخر بحيث لا يمكنني إنتاج كل كائن - خوارزمية تحتاج إلى تخزين عدة intermediate_result- في بنية البيانات. و هنا boost::multi_index_container يستخدم، لأن زوج parts و used_time يصف فريدة من نوعها intermediate_result (وينبغي أن يكون فريدا في بنية البيانات الخاصة بي) ولكن max_value هو مؤشر آخر فسوف يجب أن أفكر فيه، لأن خواريتي تحتاج دائما إلى intermediate_result مع الأعلى max_value.

لذلك حاولت استخدام boost::multi_index_container مع ordered_unique<> لبلدي "قطعتي واستخدامها - الزوج" و ordered_non_unique<> لاجلي max_value (مختلف intermediate_resultقد يكون لدى Objects نفس القيمة).

المشكلة هي: المسند، اللازم لتحديد "الأجزاء والأجزاء المستعملة" هو أصغر std::lexicographical_compare في بلدي parts-Vector وبالتالي بطيئة جدا بالنسبة للكثيرين intermediate_result-أشياء. ولكن سيكون هناك حل: طلبي لكل كائن ليس مرتفعا، لذلك يمكنني تخزينها المستطاع أجزاء - ناقلات النتائج الوسيطة بشكل فريد من قبل used_time.

على سبيل المثال: إذا كان لدي ناقلات الطلب ( 2 , 3 , 1) ثم أحتاج إلى هيكل البيانات الذي يخزن (2+1)*(3+1)*(1+1)=24 ناقلات الأجزاء المحتملة وعلى كل من هذا القبيل من هذا القبيل، والتي يجب أن تكون فريدة من نوعها! (تخزين أصغر وقت غير كاف - على سبيل المثال: إذا كان قيد الإعداد الخاص بي هو: لتلبية وقت معين للإنتاج)

ولكن كيف يمكنني الجمع بين random_access<>- مع ذلك مع ordered_unique<>-فهرس؟
(مثال 11. لم يساعدني في هذا واحد ..)

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

المحلول 2

(كان علي استخدام إجابة خاصة لكتابة كتل التعليمات البرمجية - آسف!)

ال composite_key مع used_time و parts (كما اقترح Kirill V. Lyadvinsky) في الأساس ما قمت بالفعل به بالفعل. أريد أن أتخلص من مقارنة القمامة parts-المتجه.

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

int get_index(intermediate_result &input_result) const
{
    int ret_value  = 0;
    int index_part = 1;
    for(int i=0;i<needed_demand.size();++i)
    {
        ret_value  += input_result.get_part(i) * index_part;
        index_part *= (needed_demand.get_part(i) + 1);
    }
}

من الواضح أن هذا يمكن تنفيذها بشكل أكثر كفاءة وهذا ليس هو الفهرس الوحيد الممكن طلب الطلب المطلوب. ولكن لنفترض أن هذه الوظيفة موجودة كدالة عضو intermediate_resultفي هل من الممكن كتابة شيء مثل هذا لمنع lexicographical_compare ?

indexed_by<
  random_access< >,      
  ordered_unique< 
    composite_key< 
      intermediate_result,
      member<intermediate_result, int, &intermediate_result::used_time>,
      const_mem_fun<intermediate_result,int,&intermediate_result::get_index>
    >
  >
>

إذا كان ذلك ممكنا وأهتمت مؤشر متعدد مع كل ما هو ممكن parts-Vectors (أي في تعليقي أعلاه كنت قد دفعت 24 خرائط فارغة في بنية البيانات الخاصة بي)، هل هذا يجد الإدخال الصحيح ل intermediate_result في وقت ثابت (بعد حساب الفهرس الصحيح مع get_index) ?
يجب أن أسأل هذا، لأنني لا أرى تماما، كيف random_access<> يتم ربط الفهرس ب ordered_unique<> فهرس..

ولكن شكرا لك على إجاباتك حتى الآن !!

نصائح أخرى

لاستخدام مؤشرين يمكنك كتابة ما يلي:

indexed_by<
  random_access< >,      
  ordered_unique< 
    composite_key< 
      intermediate_result,
      member<intermediate_result, int, &intermediate_result::used_time>,
      member<intermediate_result, std::vector<int>, &intermediate_result::parts>
    >
  >
>

يمكنك استخدام composite_key للمقارنة used_time في البداية و vector فقط إذا لزم الأمر. إلى جانب ذلك، ضع في اعتبارك أنه يمكنك استخدام وظيفة العضو كمؤشر.

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