2013-02-06 4 views
2

Я пытаюсь сделать простую часть кода с boost::is_any_of и boost::replace_all_copy. Фрагмент кода ниже:Как использовать boost :: is_any_of с boost :: replace_all_copy

std::string someString = "abc.def-ghi"; 
std::string toReplace = ".-"; 
std::string processedString = boost::replace_all_copy(someString, boost::is_any_of(toReplace), " "); 

Однако я получаю ошибку компиляции, которая слишком долго, чтобы вставить здесь. Может ли кто-нибудь, у кого есть опыт работы с этими двумя функциями, указать мою ошибку?

ответ

2

Я не слишком знаком с этим конкретным методом, но кажется, что replace_all_copy хочет только заменить строку, а не результат is_any_of.

Просматривая другие варианты string algorithms я заметил, что существует регулярное выражение версии, которая также будет работать:

#include <iostream>                                         
#include <boost/algorithm/string.hpp>                                     
#include <boost/algorithm/string/regex.hpp>                                   

int main(int argc, char** argv) {                                      
    std::string someString = "abc.def-ghi";                                   
    std::cout << someString << std::endl;                                    
    std::string toReplace = "[.-]"; // character class that matches . and -                           
    std::string replacement = " ";                                     
    std::string processedString =                                      
     boost::replace_all_regex_copy(someString, boost::regex(toReplace), replacement);                        
    std::cout << processedString << std::endl;                                  
    return 0;                                           
} 

Выход:

abc.def-ghi 
abc def ghi 

Это требует связыванния форсированных регулярных выражений Lib. В моем случае, я построил с:

g++ -L/usr/local/Cellar/boost/1.52.0/lib -lboost_regex-mt main.cpp

6

Я не думаю, что вы не можете. The three parameter version of boost::replace_all_copy принимает строку ввода, заменяющую строку и строку для поиска. То, что возвращает boost::is_any_of, является предикатным функтором.

То, что вы, вероятно, хотите, boost::replace_if:

#include <boost/algorithm/string.hpp>   // for is_any_of 
#include <boost/range/algorithm/replace_if.hpp> // for replace_if 
#include <string> 
#include <iostream> 

std::string someString = "abc.def-ghi"; 
std::string toReplace = ".-"; 
std::string processedString = 
    boost::replace_if(someString, boost::is_any_of(toReplace), ' '); 

int main() 
{ 
    std::cout << processedString; 
} 

Это изменяет оригинал, так что если вам нужно, чтобы сохранить его, вы можете использовать boost::replace_copy_if:

#include <boost/algorithm/string.hpp> 
#include <boost/range/algorithm/replace_copy_if.hpp> 
#include <string> 
#include <iostream> 
#include <iterator> // for back_inserter 

std::string someString = "abc.def-ghi"; 
std::string toReplace = ".-"; 

int main() 
{ 
    std::string processedString; 
    boost::replace_copy_if(someString, 
     std::back_inserter(processedString), boost::is_any_of(toReplace), ' '); 
    std::cout << processedString; 
} 

Надежда, что помогает.

+0

Я тоже смотрел на это, я не был уверен, насколько важна копия оригинального вопроса. Основываясь на документах, похоже, что someString будет изменена на месте и будет возвращена ссылка. Если копия не важна, мне нравится ваше решение лучше, так как вы избегаете использования регулярного выражения. –

+0

@JesseVogt Хорошо, я обновил ответ. – jrok

+0

Прохладный - не уверен, как я полностью пропустил, увидев 'replace_copy_if' в документах. Хорошее решение. –

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