سؤال

أنا أبحث عن بعض STL أو Boost أو حاوية مماثلة لاستخدام نفس الطريقة التي تستخدم بها الفهارس في قواعد البيانات للبحث عن سجل باستخدام استعلام مثل هذا:

select * from table1 where field1 starting with 'X';

أو

select * from table1 where field1 like 'X%';

فكرت في استخدام خريطة STD :: ، لكن لا يمكنني ذلك لأنني بحاجة إلى البحث عن الحقول التي "تبدأ بـ" بعض النص ، وليس تلك التي "تساوي". بجانب ذلك ، أحتاج إلى العمل في حقول متعددة (لكل "سجل" 6 حقول ، على سبيل المثال) ، لذلك سأحتاج إلى خريطة منفصلة لكل واحدة.

يمكنني إنشاء متجه أو قائمة مرتبة واستخدام البحث الثنائي (كسر المجموعة في كل خطوة في كل خطوة من خلال قراءة العنصر في الوسط ومعرفة ما إذا كان أكثر أو أقل من "X") ، لكنني أتساءل عما إذا كان هناك بعض الجاهزة- صنع حاوية يمكنني استخدامها دون إعادة اختراع العجلة؟

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

المحلول

Boost.Multi-Index يتيح لك الإدارة مع العديد من الفهرس وينفذ lower_bound كما هو الحال في STD :: SET/MAP. ستحتاج إلى تحديد الفهرس المقابل للحقل ثم تفعل كما لو كانت خريطة أو مجموعة.

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

template <typename SortedAssociateveContainer>
std::pair<typename SortedAssociateveContainer::iterator, 
          typename SortedAssociateveContainer::iterator> 
starts_with(
  SortedAssociateveContainer const& coll, 
  typename SortedAssociateveContainer::key_type const& k)
{
  return make_pair(coll.lower_bound(k), 
                   coll.lower_bound(next_prefix(k));
}

أين

  • يحصل NEXT_PREFIX على البادئة التالية باستخدام ترتيب معجمي استنادًا إلى مقارنة SortedAssociateVeContainer (بالطبع تحتاج هذه الوظيفة إلى مزيد من الوسائط لتكون عامة تمامًا ، انظر سؤال).

نتائج starts_with يمكن استخدامها على أي خوارزمية النطاق (انظر Boost.Range)

نصائح أخرى

std::map بخير ، أو std::set إذا لم تكن هناك بيانات غير السلسلة. تمرير سلسلة البادئة الخاصة بك إلى lower_bound للحصول على السلسلة الأولى التي ترسل في هذه النقطة أو بعدها. ثم قم بتكرار الأمام عبر الخريطة حتى تنتهي أو تجد عنصرًا لا يبدأ ببادرك.

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