使用find_if拆分字符串

时间:2009-12-16 23:33:24

标签: string iterator split c++

我在“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;
}

4 个答案:

答案 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_spacespace成员函数,如果没有,则无法调用它们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( ...