سؤال

أحاول تحسين طلبي عن طريق تقليل الرحلات الدائرية إلى قاعدة البيانات الخاصة بي. كجزء من هذا الجهد، كنت نقل بعض الجداول إلى الذاكرة، تخزينها boost.multiindex. حاويات.

كأثر جانبي لهذه العملية، فقد فقدت القدرة على القيام مطابقة البطاقة البرية على سلاسلي. على سبيل المثال، عندما تم تخزين الجدول في MySQL، يمكنني القيام بذلك:

SELECT * FROM m_table WHERE myString LIKE "foo%"

ومع ذلك، نظرا لأنني الآن أستخدم حاوية Boost.multiindex مع مفتاح من MyString، يبدو أنني فقدت هذه القدرة.

من الواضح، يمكنني استخدام وظيفة مساواة () من أجل العثور على جميع الإدخالات التي تطابق سلسلة معينة تماما:

std::pair< typename T::template index<by_name>::type::iterator,
           typename T::template index<by_name>::type::iterator > p
  = m_table.get<by_name>().equal_range(myString);

while (p.first != p.second )
{
  // do something with the EXACT matching entry
  ++p.first;
}

ولكن يبدو أن الطريقة الوحيدة للقيام بمباراة بطاقة برية هي المشي في الهيكل بأكمله ومقارنة كل مفتاح دفعة :: Regex مع دفعة :: Regex_Match ().

std::pair< typename T::template index<by_name>::type::iterator,
           typename T::template index<by_name>::type::iterator > p
  = std::make_pair(m_table.get<by_name>().begin(),m_table.get<by_name>().end());

while (p.first != p.second )
{
  boost::regex e(myRegex);
  if ( boost::regex_match(p.first->myString, e ) )
  {
     // Do something with the REGEX matching entry
  }
  ++p.first;
}

هل هناك طريقة أفضل؟

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

المحلول

حسنا، أولا، لا تضطر في الواقع إلى استخدام دفعة :: Regex، إذا كانت البدل بسيطة بما فيه الكفاية، فيمكنك الابتعاد عن طريق Rolling You Unary Accountator. أود أن أشير إلى أن Boost.Regex هو واحد من الجزء القلائل من المكتبة التي تتطلب بالفعل ربطها (وليس رأس فقط).

أما بالنسبة لمشكلة المشي في الهيكل بأكمله، فأنا آسف ولكن لا يوجد الكثير يمكن أن يفعلك هنا ... إذا كنت لا تعرف عمليات البحث في التطورات.

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

إذا كنت تأمل أكثر من ذلك، فيرجى تقديم المزيد من المعلومات بشأن نوع أحرف البدل التي تريد استخدامها والظروف.

نصائح أخرى

في حالتك المحددة، يمكنك القيام ب Lower_bound ("Foo") ثم تمشي إلى الأمام يبحث عن التطابقات، حتى تضغط على شيء لا يتطابق أو الوصول إلى نهاية الحاوية. لا أعتقد أن هناك طريقة عامة للقيام بهذا البحث.

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