我在“Accelerated C ++”(第6.1.1章)一书中找到了以下代码,但我无法编译它。问题在于find_if
行。我有必要的包括(矢量,字符串,算法,cctype)。有什么想法吗?
谢谢,Jabba
bool space(char c) {
return isspace(c);
}
bool not_space(char c) {
return !isspace(c);
}
vector<string> split_v3(const string& str)
{
typedef string::const_iterator iter;
vector<string> ret;
iter i, j;
i = str.begin();
while (i != str.end())
{
// ignore leading blanks
i = find_if(i, str.end(), not_space);
// find end of next word
j = find_if(i, str.end(), space);
// copy the characters in [i, j)
if (i != str.end()) {
ret.push_back(string(i, j));
}
i = j;
}
return ret;
}
答案 0 :(得分:2)
以类似STL的方式写这个,
#include <algorithm>
#include <cctype>
#include <functional>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
using namespace std;
template<class P, class T>
void split(const string &str, P pred, T output) {
for (string::const_iterator i, j = str.begin(), str_end = str.end();
(i = find_if(j, str_end, not1(pred))) != str_end;)
*output++ = string(i, j = find_if(i, str_end, pred));
}
int main() {
string input;
while (cin >> input) {
vector<string> words;
split(input, ptr_fun(::isspace), inserter(words, words.begin()));
copy(words.begin(), words.end(), ostream_iterator<string>(cout, "\n"));
}
return 0;
}
答案 1 :(得分:1)
您发布的代码没有问题。您链接到的真实代码存在一个非常明显的问题:is_space
和space
是成员函数,如果没有,则无法调用它们Split2的一个例子。但是,这个要求没有意义,所以至少你应该将这些功能静态。
(实际上,将split_v3作为成员函数也没有多大意义。让一个名为Split2的类实现了只有一个自由函数 - 可能在命名空间中?)
答案 2 :(得分:1)
根据要求:
class SplitV2 {
public:
void foo();
private:
struct space { bool operator() (char c) { return isspace(c); } };
struct not_space {
Split2::space space;
bool operator() (char c) { return !space(c); }
};
与std::find_if(it, it2, space())
或std::find_if(it, it2, not_space()
一起使用。
请注意,not_space具有默认构造空间作为成员变量。在每次调用bool not_space::operator()
时构造空间可能不明智,但编译器可能会处理这个问题。如果重载operator()的语法让您感到困惑,并且您想要了解有关使用结构作为谓词的更多信息,那么您应该查看运算符重载和STL的一些指导。
答案 3 :(得分:0)
副手,我会说应该是
i = str.find_if( ...
j = str.find_if( ...