سؤال

وكيف يمكنني تحديد البحث في boost::multi_index من قبل نتيجة لعملية بحث سابقة؟ وكمثال على ذلك: لنفترض أن لدي فئة المستطيل مع قيمة داخلية مثل هذا:

    class MyRect
    {
    public:
        int    width;  
        int    height; 

        double value;
    }

وأنا بحاجة إلى بنية بيانات من هذا الكائن للرد على استفسارات مثل "إعطاء input_rectangle - الكائن الذي يرد MyRect في هذا المستطيل ويحتوي على أعلى قيمة"

وأنا يمكن استخدام "multi_index 'مثل هذا:

    struct given_value{};
    struct given_width{};
    struct given_height{};

    typedef multi_index_container<MyRect,
        indexed_by<
            ordered_non_unique< tag<given_value>, 
                member<MyRect, double, &MyRect::value>,
            ordered_non_unique< tag<given_width>, 
                member<MyRect, int, &MyRect::width>,
            ordered_non_unique< tag<given_height>, 
                member<MyRect, int, &MyRect::height>, >
        >
    > MyDataStructure;

    typedef MyDataStructure::index<given_width>::type MyDataStructureGivenWidth;
    typedef MyDataStructureGivenWidth::iterator WidthIterator;

وإذا كان لي أن input_rectangle ديه input_width عرض أتمكن من استخدام شيء من هذا القبيل:

WidthIterator start_iter = data_object.get<given_width>().begin();
WidthIterator end_iter   = data_object.get<given_width>().upper_bound(input_width);

ولكن كيف يمكنني تحديد البحث لارتفاع coresp من قبل اثنين من المكررات معين؟ (وبعد ذلك العثور على الكائن مع أعلى قيمة في هذه النتيجة؟)

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

المحلول

وأنا لا أعتقد أنه يمكنك القيام قيود inplace.
تخزين المكررات الناتجة من الاستعلام بعرض مطابق في وعاء آخر واستخدام تلك الحاوية للعثور على ارتفاعات مطابقة مع remove_if. ثم استخدم max_element للعثور على أكبر.

إذا قمت بتخزين العناصر على المؤشرات، هل يمكن استخدام نفس MIC لتخزين النتائج.

نصائح أخرى

إذا فهمت مشكلتك بشكل صحيح، قد يكون هناك حل أبسط. وضعت للتو MyRects الخاص بك إلى-مجموعة STL أمر من حيث القيمة (بحاجة إلى تحديد عامل مقارنة أو وظيفة مقارنة مخصص). ويمكنك إنشاء المسند المخصصة التي واستخدام يتحقق إذا كان MyRect معين هو داخل نطاق معين. ثم استخدام find_if STL-خوارزمية، وتسليمه المسند المخصصة. إذا عليك التأكد من أن تقطع تسلسل بالترتيب التنازلي (على سبيل المثال باستخدام reverse_iterator)، يجب أن تعيد MyRect كنت تبحث عنه.

وعلى أمل أن أمر مفهوم وينطبق على مشكلتك.

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