2012-08-31 2 views
0

Я борюсь за это, и я до такой степени, что не успеваю, и пришло время обратиться за помощью. Мое знакомство с библиотеками ускорения немного лучше поверхностного. Я пытаюсь сделать прогрессивное сканирование через довольно большую строку. Фактически, это все содержимое файла, прочитанного в std :: string object (файл не будет таким большим, это результат из командной строки).boost :: regex_search отказывается принимать мои аргументы

Выход этой программы, pnputil, повторяется. Я ищу определенные шаблоны, чтобы найти файл «oemNNN.inf», который я хочу. По сути, мой алгоритм состоит в том, чтобы найти первый «oemNNN.inf», поиск идентифицирующих характеристик для этого файла. Если это не тот, который я хочу, переходите к следующему.

В коде, это что-то вроде:

std::string filesContents; 
std::string::size_type index(filesContents.find_first_of("oem")); 
std::string::iterator start(filesContents.begin() + index); 
boost::match_results<std::string::const_iterator> matches; 
while(!found) { 
    if(boost::regex_search(start, filesContents.end(), matches, re)) 
    { 
     // do important stuff with the matches 
     found = true; // found is used outside of loop too 
     break; 
    } 

    index = filesContents.find_first_of("oem", index + 1); 
    if(std::string::npos == index) break; 
    start = filesContents.being() + index; 
} 

Я использую this example из документации библиотеки подталкивания для 1.47 (версии я использую). Кто-то, пожалуйста, объясните мне, как мое использование отличается от того, что имеет этот пример (кроме того, что я не храню материал на картах и ​​т. Д.).

Из того, что я могу сказать, я использую те же типы итераторов, которые использует пример. Тем не менее, когда я компилирую код, компилятор Microsoft говорит мне, что: ни один экземпляр перегруженной функции boost :: regex_search не соответствует списку аргументов. Тем не менее, intellisense показывает эту функцию с аргументами, которые я использую, хотя итераторы называются чем-то BidiIterator. Я не знаю значения этого, но, учитывая пример, я предполагаю, что независимо от того, что является BidiIterator, он принимает std :: string :: iterator для построения (возможно, плохое предположение, но, похоже, имеет смысл, учитывая пример). В примере показан пятый аргумент match_flags, но этот аргумент по умолчанию имеет значение: boost :: match_default. Поэтому он не должен быть лишним. Однако, просто для ударов и усмешек, я добавил этот пятый аргумент, и все же он не работает. Как я злоупотребляю аргументами? Особенно при рассмотрении примера.

Ниже приведена простая программа, которая демонстрирует проблему без алгоритма цикла.

#include <iostream> 
#include <string> 

#include <boost/regex.hpp> 

int main() { 
std::string haystack("This is a string which contains stuff I want to find"); 
boost::regex needle("stuff"); 

boost::match_results<std::string::const_iterator> what; 
if(boost::regex_search(haystack.begin(), haystack.end(), what, needle, boost::match_default)) { 
    std::cout << "Found some matches" << std::endl; 
    std::cout << what[0].first << std::endl; 
} 

return 0; 
} 

Если вы решили скомпилировать, я компилирую и связываю с 1.47 библиотеки boost. Проект, над которым я работаю, широко использует эту версию и обновляется не для меня.

Спасибо за любую помощь. Это очень неприятно.

Andy

ответ

2

В целом типы итераторов различны.

std::string haystack("This is a string which contains stuff I want to find"); 

возвращающие значения из begin() и end() будет std::string::iterator. Но ваш тип матча

boost::match_results<std::string::const_iterator> what; 

std::string::iterator и std::string::const_iterator различные типы. Таким образом, существует несколько вариантов

  1. объявлять строку константным (т.е. const std::string haystack;)
  2. декларировать итераторы как const_iterators (т.е. std::string::const_iterator begin = haystack.begin(), end = haystack.end();) и передать их в regex_search.
  3. использование boost::match_results<std::string::iterator> what;
  4. если у вас есть C++ 11 вы можете использовать haystack.cbegin() и haystack.cend()

example of work

+0

Спасибо большое! Я знал, что проблема должна быть простой. Я просто потратил слишком много времени на это и потребовал второй набор глаз. Я полностью игнорировал использование примера «const std :: string ...» в параметрах функции. Одна вещь: я ожидал бы, что если строковый объект будет const, то вызов 'myString.begin()' будет возвращать константный итератор. Однако на самом деле мне пришлось использовать 'std :: string :: const_iterator begin (myString.begin());', чтобы заставить его работать. Почему это? –

+0

@AndrewFalanga Как вы можете видеть http://liveworkspace.org/code/57db9afe6464f944f2fecc4d8561ab91 'const std :: string.begin()' возвращает 'const_iterator'. – ForEveR

Смежные вопросы