2013-02-06 185 views
2

我正在嘗試使用boost::is_any_ofboost::replace_all_copy來編寫一段簡單的代碼。這段代碼如下:如何使用boost :: is_any_of with 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 

這確實需要鏈接到的升壓正則表達式庫。就我而言,我建:

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。好的解決方案 –