【问题标题】:iterator type for Template split class constructor in C++C ++中模板拆分类构造函数的迭代器类型
【发布时间】:2016-05-24 08:55:31
【问题描述】:
template <class write_iter> //class for splitting a line into individual words
class Split
{
public:
split(const string& line, write_iter destination)
{
    typedef string::const_iterator iter;
    iter i;

    while(i != line.end())
    {
        i = find_if(i, line.end(), not_space);
        iter j = find_if(i, line.end(), space);

        if (i != line.end())
            *destination++ = string(i,j);

        i = j;
    }
}

bool not_space(char c)
{
    return !isspace(c);
}

bool space(char c)
{
    return isspace(c);
}
};

int main()
{
while(getline(cin, line))
    Split<> split(line, back_inserter(words));
}
  • 我希望能够传递任何我想要的迭代器: 例如:back_insterter(somevector)、ostream_iterator

  • 对于 back_inserter,Split 分裂?

【问题讨论】:

    标签: c++ class templates iterator


    【解决方案1】:
    Split <decltype(back_inserter(words))>(line, back_inserter(words));
    

    或者这里是完整的类型:

    Split <std::back_insert_iterator<std::vector<std::string>>>(line, back_inserter(words));
    

    为什么不使用模板化的构造函数而不是模板化的类呢?这会让事情变得容易得多。

    那些not_spacespace 函数也应该是静态的,find_if 才能工作。或者把他们移到课堂外。

    还有一件事:back_insert_iterator 不需要递增。 *destination = string(i,j); 就够了。

    【讨论】:

    • 谢谢,两个迭代器都不需要增量。是的,我认为把它放在课堂上是个坏主意,我之前曾作为一个函数拆分过,我想看看如果它放在课堂上我能做些什么。谢谢!我以前从来没有机会让自己处于需要 'decltype()' 的境地,所以这很令人兴奋 :) 现在一切正常。
    • 我也确实最终将其更改为模板构造函数,这样容易得多。
    猜你喜欢
    • 2012-07-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    相关资源
    最近更新 更多