Я борюсь за это, и я до такой степени, что не успеваю, и пришло время обратиться за помощью. Мое знакомство с библиотеками ускорения немного лучше поверхностного. Я пытаюсь сделать прогрессивное сканирование через довольно большую строку. Фактически, это все содержимое файла, прочитанного в 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
Спасибо большое! Я знал, что проблема должна быть простой. Я просто потратил слишком много времени на это и потребовал второй набор глаз. Я полностью игнорировал использование примера «const std :: string ...» в параметрах функции. Одна вещь: я ожидал бы, что если строковый объект будет const, то вызов 'myString.begin()' будет возвращать константный итератор. Однако на самом деле мне пришлось использовать 'std :: string :: const_iterator begin (myString.begin());', чтобы заставить его работать. Почему это? –
@AndrewFalanga Как вы можете видеть http://liveworkspace.org/code/57db9afe6464f944f2fecc4d8561ab91 'const std :: string.begin()' возвращает 'const_iterator'. – ForEveR