首先介绍一下背景:
我一直在编写一个编程作业,这需要我解析一个文本语法文件。在这里,我需要将std::list<string>
中的占位符字符串替换为相应的扩展(字符串代表一个句子)。
我遍历列表,并用:
删除匹配的字符串itr = ls.erase(itr)
其中itr是迭代器,ls是我的std::list<string>
然后插入像
这样的扩展itr = ls.insert(itr, other.begin(), other.end());
其他是存储扩展的容器。
我的问题是前一行显然不起作用。它应该是有效的c ++ 11语法,我真的希望迭代器指向我刚刚插入的内容的开头。但是我收到编译错误,因为insert
显然会返回void
。
我已经使用cplusplus.com和as far as i can see查看了,我没有看到我如何使用它。 The standard(或至少我能看到的那个)说:
iterator insert(const_iterator position, InputIterator first,
InputIterator last);
我正在使用带有-std=c++11
标志的g ++(4.8.1)进行编译,但当我在(gcc-directory)/include/c++/4.8.1/bits
中查看stl_list.h时,我看到了:
void
insert(iterator __position, _InputIterator __first,_InputIterator __last)
这只是因为gcc还没有完全实现c ++ 11库吗?他们忽略了这一点吗?似乎并不难做,围绕它的所有其他插入函数都返回一个迭代器。
我知道我可以毫不费力地解决这个问题,但是知道发生了什么事情仍然会很好。
谢谢!
编辑显然this回答了我的问题。很抱歉打扰你,可惜我以前找不到。
答案 0 :(得分:2)
Libstdc ++尚未更新,尚未从该函数返回迭代器。
这个修补程序在两个月前修复了这个修补程序:http://gcc.gnu.org/ml/libstdc++/2013-07/msg00000.html
这一变化是在GCC 4.8.1发布之后做出的,我认为这一变化无论如何都不会被移植到4.8分支。