与えられた署名を持つ関数では、シーケンスの要素を最初のものから最後のものに並べ替えたい、その述語を満たすすべての要素がそうでない要素の前に置かれ、与えられた述語を満たさない最初の要素。イテレータを使って述語で再編成する
同じ位置に新しい要素がそれを満たしている場合に存在する元素は、述語が再び最後の1つの
- スタートです
- (last-1)と置き換えない場合は、さらに進むようにしてください。
- 既に交換した要素の1つに到達するまで繰り返す
私のコード
template<class Iterator, class Predicate>
Iterator Rearrange(Iterator first, Iterator last, Predicate pred) {
auto res = first;
if (first == last) {
;
}
else {
auto run = first;
auto end = last;
auto tmp = *first;
while (run != end) {
if (pred(*run) == false) {
again: tmp = *(--end);
*end = *run;
*run = tmp;
if (pred(*run) == false) {
goto again;
}
}
++run;
}
}
return res;
}
それは私に私が見つけ、理解することはできません
terminate called after throwing an instance of 'std::range_error'
what(): dereferencing end of sequence
Aborted
を与えます。つまり、私はどこかでコンテナの外の要素を間接参照しようとしていますが、私のプログラムでそれを見ることはできません。誰も私がコーディングエラーを修正するか、私のアルゴリズムのロジックを改善するのを助けることができますか?
私は18年前に仕事がVB6からC++に移行してからC#に移行し、再び「goto」に取り組む必要はないと思っていました。 – Steve