5

C++を学習しているだけなので、これを正しく理解していない可能性がありますが、範囲挿入関数が新しい標準(C++ Primer 5th Ed、cplusplus.comcppreference.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;
    }
}
4

1 に答える 1

4

完全にサポートするコンパイラはC++11まだありません。の以降のバージョンでgccclang、新しい標準の大部分が実装されていますが、まだ実行する必要がある部分があります。実際、basic_string.hforを見るとgcc 4.7.0、このバージョンのinsertがまだ更新されていないことがわかります。

  template<class _InputIterator>
    void
    insert(iterator __p, _InputIterator __beg, _InputIterator __end) { ... }
于 2013-04-11T04:15:59.963 に答える