递增back_inserter是可选的

incrementing back_inserter is optional?

本文关键字:inserter back 递增      更新时间:2023-10-16

我不知道在设置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"));        
}

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

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

就其价值而言,在这种特殊情况下,您可以使用更少/更简单的代码获得相同的基本效果:

string s;
getline(cin, s);
replace(s, ' ', 'n');
cout << s;

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

std::back_insert_iterator<Cont>的规范规定,typename Cont::value_type的每次赋值都会调用底层类型上的cont.push_back(value)operator*()只是返回迭代器本身,operator++()也是如此。

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