递增back_inserter是可选的吗?

时间:2013-11-20 22:05:02

标签: c++ iterator

我很困惑在设置时是否应该增加OutputIterator。请参阅以下代码,我正在尝试拆分字符串。我的问题是while循环的第三行,代码似乎工作正常,无论我有* oit = ...或* oit ++ = ... 有人可以向我解释原因吗?

template<class O> void split(string& s, O oit){

        string::iterator jt, it = s.begin();

   while(1){
        jt = find(it, s.end(), ' ');
        if(it == s.end() && jt == s.end()) return;
        *oit++ = string(it, jt);
        it = jt;
        if(it != s.end() ) it++;
   }
}

...

int main(){

        string s;
        getline(cin, s);

        vector<string> v;

        split(s, back_inserter(v));
        copy(v.begin(), v.end(), ostream_iterator<string>(cout, "\n"));        

}

3 个答案:

答案 0 :(得分:3)

std::back_inserter创建一个迭代器,通过在底层集合上调用push_back来插入。这意味着增量不是正常工作所必需的。

虽然其他输出迭代器也不一定如此,所以为了使代码正确,它应该执行增量事件,尽管在这种特殊情况下它基本上被忽略了。

只是为了它的价值,在这种特殊情况下,您可以使用更少/更简单的代码获得相同的基本效果:

string s;
getline(cin, s);

replace(s, ' ', '\n');
cout << s;

答案 1 :(得分:3)

该概念要求您为每次写入增加输出迭代器。虽然std::back_insert_iterator<T>可能会在push_back()的每个赋值上对相应对象调用*it,但该概念仍然要求调用增量运算符。原则上,输出迭代器可以是函数调用,但是为了适应指针所使用的相同接口,它们需要支持相同的操作。

std::back_insert_iterator<Cont>的规范说明基础类型typename Cont::value_type上的cont.push_back(value)调用operator*()的每个赋值只返回迭代器本身,operator++()也是如此。 }。

答案 2 :(得分:0)

这两个部分都可以工作,因为标准迭代器在与泛型编程一起使用时,在功能上等同于原始指针。使用原始指针时,必须递增它们以到达后续地址。