【问题标题】:STL containers' range insert functions returning void under c++11?STL容器的范围插入函数在c ++ 11下返回void?
【发布时间】:2013-04-03 03:58:03
【问题描述】:

刚学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。即使看标题,它似乎就是这样写的,而且我无法修改任何东西来解决这个问题。

我错过了什么?

这是我试图编写的“章节练习结束”功能;用给定字符串中的一个字符串替换另一个字符串:

(我知道它不会按预期的方式运行)

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;
    }
}

【问题讨论】:

  • 您使用的是哪个版本的 MinGW?请不要说“每个版本”。那没有帮助。具体一点。
  • 啊,谢谢。使用mingw-get-inst-20120426.exe的最新版本,4.6.2; i686-w64-mingw32-gcc-dw2-4.8.0-win32_rubenvb; x86_64-w64-mingw32-gcc-4.6.3-2-release-win64_rubenvb;和 MinGW-TDM 4.7.1-dw2
  • 似乎标准库的实现在某些地方还没有赶上新标准。
  • @Nawaz:即使是 4.8 也没有实现它:liveworkspace.org/code/3dnNFJ$0 -- VC11 实现了。
  • 注意:这不是编译器问题,而是标准库实现问题。虽然每个编译器都捆绑了一个标准库实现,但您可以将一个实现换成另一个:例如 Clang 编译 libstdc++ 和 libc++。

标签: c++ c++11 g++ mingw std


【解决方案1】:

目前还没有完全支持C++11 的编译器。 gcc 和 clang 的更高版本实现了大部分新标准,但仍有部分需要完成。确实,在basic_string.h 中查看gcc 4.7.0 表明此版本的insert 尚未更新:

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

【讨论】:

  • 如果不只是我把事情搞砸了,那会减轻一些挫败感,尽管我确实希望我能找到一个受支持的版本。感谢您的帮助!
  • @Habnab:Visual Studio 11 已正确实现。
  • @BenjaminLindley:谢谢。不过,出于某种我无法理解的原因,我一直试图避免使用 VS。在我学习该语言时尝试使用最少的工具集(到目前为止是 vim 和 make/tup)。我可能会在某个时候屈服。非常感谢您的帮助。
  • @Habnab:您可以从命令行运行 Visual Studio 工具集,如果需要,甚至可以使用 makefile。
  • 那我肯定会尝试的!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 2016-08-28
  • 1970-01-01
  • 2018-04-08
  • 2016-01-13
相关资源
最近更新 更多