1

首先介绍一下背景:

我一直在写一个编程作业,这需要我解析一个文本语法文件。在此,我需要将 a 中的占位符字符串替换std::list<string>为其对应的扩展(该字符串表示一个句子)。

我遍历列表,并删除匹配的字符串:

itr = ls.erase(itr)

其中 itr 是迭代器, ls 是我的std::list<string>

然后我插入扩展

itr = ls.insert(itr, other.begin(), other.end());

其中 other 是存储扩展的容器。

我的问题是上一行显然不起作用。它应该是有效的 c++11 语法,我真的希望迭代器指向我刚刚插入的内容的开头。但我得到编译错误,insert显然返回void.

我已经检查过 cplusplus.com,据我所知,我认为我的使用方式没有任何问题。标准(或至少我能看到的标准)规定:

iterator insert(const_iterator position, InputIterator first,
    InputIterator last);

我正在使用带有-std=c++11标志的 g++ (4.8.1) 进行编译,但是当我查看 stl_list.h 时,(gcc-directory)/include/c++/4.8.1/bits我看到:

void
    insert(iterator __position, _InputIterator __first,_InputIterator __last)

这仅仅是因为 gcc 还没有完全实现 c++11 库吗?他们忽略了这一点吗?似乎并不难做到,并且围绕它的所有其他插入函数都返回一个迭代器。

我知道我可以轻松解决这个问题,但仍然很高兴知道发生了什么。

谢谢!

编辑显然回答了我的问题。不好意思打扰了,可惜之前没找到。

4

1 回答 1

2

Libstdc++ 还没有更新为从该函数返回一个迭代器。

两个月前,这个补丁在颠覆主干上修复了这个问题:http: //gcc.gnu.org/ml/libstdc++/2013-07/msg00000.html

该更改是在 GCC 4.8.1 发布之后进行的,而且我不认为该更改已被反向移植到 4.8 分支。

于 2013-09-03T08:27:22.403 回答