البحث عن indecies متعددة مع دفعة متعدد مؤشر
-
10-07-2019 - |
سؤال
وكيف يمكنني تحديد البحث في 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 كنت تبحث عنه.
وعلى أمل أن أمر مفهوم وينطبق على مشكلتك.