递增back_inserter是可选的
incrementing back_inserter is optional?
我不知道在设置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++()
也是如此。
这两个部分都能工作,因为标准迭代器在与泛型编程一起使用时,在功能上等效于原始指针。使用原始指针时,必须将其递增才能到达后续地址。
相关文章:
- 推导 std::vector::back() 的返回类型
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- 线路抑制状态错误 C4703 可能未初始化的局部指针变量"back"已使用
- std::vector using back(), pop_back(), push_back(), 得到'double free or corruption'错误
- C++ STL-Inserter
- vector.back()和vector.end()有什么区别
- 列表大小为 1,但 front() 和 back() 不相等
- 返回C++中没有 back() 方法的容器的最后一个元素?
- 在非空 std::list 上使用 std::list.back<int>() 时"Segmentation Fault"
- 我们可以使用Back() - 值索引在其上执行向量插入
- 当我运行以下代码添加str.front() str.back时,它给了我200个,但为什么
- 链表回推操作中需要'back pointer'
- 为什么 std::string 的 back() 应该返回对字符的引用?
- VC++ 自动说明符假定矢量的引用限定符<bool>::back的引用限定符
- C: strtok value gives back null
- vector.back() 可以用来为向量的最后一个元素赋值吗?
- 在std::vector中实现back()
- 在push_front属性上有点混淆.intlist.push_front(2 * intlist.back())会做些
- 将对象转换为 char,然后"uncasting it back"