Frage

Ich versuche, meine Anwendung zu optimieren, indem ich die Roundreise auf meine Datenbank reduziere. Als Teil dieser Anstrengung habe ich einige Tabellen in das Gedächtnis gebracht und sie als gespeichert als Boost.multiIndex Behälter.

Als Nebeneffekt dieses Prozesses habe ich die Fähigkeit verloren, meine Saiten zu montieren. Wenn die Tabelle beispielsweise in MySQL gespeichert wurde, konnte ich Folgendes tun:

SELECT * FROM m_table WHERE myString LIKE "foo%"

Da ich jetzt einen Boost.MultiIndex -Container mit einem Schlüssel von MyString verwende, scheint ich diese Fähigkeit verloren habe.

Offensichtlich kann ich die Funktion Equal_Range () verwenden, um alle Einträge zu finden, die genau mit einer bestimmten Zeichenfolge übereinstimmen:

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;
}

Aber es scheint, dass der einzige Weg, ein Wildcard-Match zu machen, darin besteht, die gesamte Struktur zu laufen und jeden Schlüssel mit einem Boost :: regex mit Boost :: regex_match () zu vergleichen.

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;
}

Gibt es einen besseren Weg?

War es hilfreich?

Lösung

Nun, zuerst müssen Sie eigentlich keinen Boost :: Regex verwenden. Wenn die Wildcard einfach genug ist, können Sie entkommen, indem Sie Ihnen einen eigenen unären Operator rollen. Ich würde beachten, dass Boost.regex einer der wenigen Teil der Bibliothek ist, die tatsächlich verknüpft werden muss (nicht nur Header).

Was das Problem des Gehens der gesamten Struktur betrifft, tut mir leid, aber es gibt nicht viel, was Sie hier tun können ... wenn Sie die Suche in Fortschritten nicht kennen.

Wenn Sie die Parameter kennen, nach denen Sie im Voraus suchen würden, können Sie eine spezielle Ansicht des Multi-Index 3 Zeichen).

Wenn Sie auf mehr gehofft haben, geben Sie bitte weitere Informationen zu den Wildkarten, die Sie verwenden möchten, und die Umstände.

Andere Tipps

In Ihrem speziellen Fall können Sie einen Lower_bound ("Foo") machen und dann nach Streichhölzer suchen, bis Sie etwas treffen, das nicht zum Ende des Containers übereinstimmt oder nicht. Ich glaube nicht, dass es eine allgemeine Möglichkeit gibt, diese Suche durchzuführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top