2014-01-27 86 views
0

我有几个问题在下面。我只从Stackoverflow获取了这段代码并试图理解。拆分和解析字符串,并在C++中转换为char *

如何分割代码工作是具体的:我不明白下面的代码

std::stringstream ss(s); 
std::string item; 
while (std::getline(ss, item, delim)) { 
    elems.push_back(item); 

我加入的代码删除空间,但它给我的编译error.Again我已经采取代码计算器并不能图出了错误

split.cpp:34:88: error: no matching function for call to 
‘remove_if(std::vector<std::basic_string<char> >::iterator, 
std::vector<std::basic_string<char> >::iterator, <unresolved 
overloaded function type>)’ split.cpp:34:88: note: candidate is: In 
file included from 
/linux/depot/gcc-4.7.0/bin/../lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/algorithm:63:0, 
       from split.cpp:5: /linux/depot/gcc-4.7.0/bin/../lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/bits/stl_algo.h:1140:5: 
note: template<class _FIter, class _Predicate> _FIter 
std::remove_if(_FIter, _FIter, _Predicate) 
/linux/depot/gcc-4.7.0/bin/../lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/bits/stl_algo.h:1140:5: 
note: template argument deduction/substitution 
failed:split.cpp:34:88: note: couldn't deduce template parameter 
‘_Predicate’ 

我怎么能转换vector<string>为char *

#include<iostream> 
    #include<string> 
    #include<sstream> 
    #include<vector> 
    #include<algorithm> 
    #include<cctype> 
    using namespace std; 

    std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) { 
     std::stringstream ss(s); 
     std::string item; 
     while (std::getline(ss, item, delim)) { 
      elems.push_back(item); 
     } 
     return elems; 
    } 

    std::vector<std::string> split(const std::string &s, char delim) { 
     std::vector<std::string> elems; 
     split(s, delim, elems); 
     return elems; 
    } 

    int main() 
    { 
     std::vector<std::string> f_data; 
     f_data.push_back("A= 99.58%"); 
     f_data.push_back("B= 78%"); 
     f_data.push_back("C= 90%"); 
     vector<string>::iterator t_data; 
     for(t_data = f_data.begin(); t_data != f_data.end(); t_data++) 
     { 
      vector<string> temp_data = split(*t_data, '='); 
      //temp_data.erase(std::remove_if(temp_data.begin(), temp_data.end(), std::isspace), temp_data.end()); 
     vector<string>::iterator data; 
     for(data = temp_data.begin(); data != temp_data.end(); data++) 
     { 
      cout<<*data; 
     } 

    } 
    return 0; 
} 

回答

1

为什么你返回elems矢量?你通过引用传递它,你不必返回它。

void split(const std::string &s, char delim, std::vector<std::string> &elems) { 
    std::stringstream ss(s); 
    std::string item; 
    while (std::getline(ss, item, delim)) { 
     elems.push_back(item); 
    } 
    return elems; 
} 

当然,这看起来更好(注意,它是由返回值):

std::vector<std::string> split(const std::string &s, char delim) { 
    std::vector<std::string> elems; 
    std::stringstream ss(s); 
    std::string item; 
    while (std::getline(ss, item, delim)) { 
     elems.push_back(item); 
    } 
    return elems; 
} 

至于如何转换vector<string>char*,串联在载体中的字符串,然后访问内部缓冲区产生的字符串与c_str()

0

有两个std :: isspace(一个在< cctype>,另一个在<区域设置>)。你也应该删除空格,而不是向量中的字符串:

inline bool is_space(char c) { return std::isspace(c); } 


... 
for(std::vector<std::string>::iterator t = temp_data.begin(); t != temp_data.end(); ++t) { 
    std::string& s = *t; 
    std::remove_if(s.begin(), s.end(), is_space); 
} 
... 
+0

hmm。得到它了。我犯了这个错误 – user765443