我很困惑在设置时是否应该增加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"));
}
答案 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)
这两个部分都可以工作,因为标准迭代器在与泛型编程一起使用时,在功能上等同于原始指针。使用原始指针时,必须递增它们以到达后续地址。