Boost :: Multi_index_container مع Random_Access وطلب_unique
-
19-09-2019 - |
سؤال
لدي مشكلة في الحصول عليها 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
فقط إذا لزم الأمر. إلى جانب ذلك، ضع في اعتبارك أنه يمكنك استخدام وظيفة العضو كمؤشر.