5

私の目的は、この質問の解決策を試すことでした:ベクター内のすべての空の要素を end から削除します消去削除イディオムを使用します。

アイデアは、指定された文字列で空 (空白に等しい) である最後から始まるすべての要素を削除することstd::vector<std::string>です。空でない要素が見つかった場合、要素の削除は停止する必要があります。

例:

vec = { " ", "B", " ", "D", "E", " ", " ", " " };

削除後:

vec = { " ", "B", " ", "D", "E"};

これが私が試した解決策です:

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>

int main()
{
    std::vector<std::string> vec = { " ", "B", " ", "D", "E", " ", " ", " " };

    bool notStop = true;
    auto removeSpaceFromLast = [&](const std::string& element)-> bool
    {
        if(element != " " ) notStop = false;
        return ( (element == " ") && (notStop) );
    };

    vec.erase(
        std::remove_if(vec.rbegin(), vec.rend(), removeSpaceFromLast),
            vec.rend() );

    std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(std::cout,","));

    return 0;
}

これによりエラーが発生しました:

no matching function for call to  std::vector<std::__cxx11::basic_string<char> >::erase(std::reverse_iterator<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > > >, std::vector<std::__cxx11::basic_string<char> >::reverse_iterator)'|

次に、ここの作業について読みstd::vector::erase()ました: Does vector::erase not work with reverse iterator?

そしてコードを変更しました:

vec.erase(
    std::remove_if(vec.rbegin().base(), vec.rend().base(), removeSpaceFromLast),
        vec.rend().base() );

今回はコンパイルしましたが、出力=元のベクトルが得られました。

誰でも説明できますか:

  1. なぜこれが起こったのですか?
  2. 可能であれば、どうすれば修正できますか?
4

1 に答える 1