私の目的は、この質問の解決策を試すことでした:ベクター内のすべての空の要素を 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() );
今回はコンパイルしましたが、出力=元のベクトルが得られました。
誰でも説明できますか:
- なぜこれが起こったのですか?
- 可能であれば、どうすれば修正できますか?