STL 容器的范围插入函数在 C++11 下返回 void?

STL containers' range insert functions returning void under c++11?

本文关键字:C++11 返回 void 函数 范围 插入 STL      更新时间:2023-10-16

刚刚学习c++,所以我可能没有正确理解这一点,但我只读到范围插入函数在新标准下返回一个迭代器(c++ Primer 5th Ed, cplusplus.com, cppreference.com,以及各种建议使用它来维护迭代器有效性的答案)。

从cppreference.com

:

template< class InputIt >
iterator insert( const_iterator pos, InputIt first, InputIt last );

然而,我尝试过的Cygwin GCC和MinGW的每个版本都使用-std=c++11返回void。即使看一下标题,它似乎就是这样写的,并且我无法修改来修复它。

我错过了什么?

这是我试图写的"end of chapter exercise"函数;用给定字符串中的另一个字符串替换一个字符串:

(我知道它不会像它写的那样起作用)

void myfun(std::string& str, const std::string& oldStr, const std::string& newStr)
{
    auto cur = str.begin();
    while (cur != str.end())
    {
        auto temp = cur;
        auto oldCur = oldStr.begin();
        while (temp != str.end() && *oldCur == *temp)
        {
            ++oldCur;
            ++temp;
            if (oldCur == oldStr.end())
            {
                cur = str.erase(cur, temp);
                // Here we go. The problem spot!!!
                cur = str.insert(cur, newStr.begin(), newStr.end());
                break;
            }
        }
        ++cur;
    }
}

目前还没有完全支持C++11的编译器。后来的gccclang版本实现了大部分新标准,但仍有部分需要完成。实际上,查看gcc 4.7.0basic_string.h显示insert的这个版本还没有更新:

  template<class _InputIterator>
    void
    insert(iterator __p, _InputIterator __beg, _InputIterator __end) { ... }