は、私がs
を使用する必要が言う:std :: find()はCスタイルの配列で後方に移動しますか?
typedef struct tagSOMESTRUCT // Defined by someone else; C-compatible
{
int count;
int elements[256];
} SOMESTRUCT;
SOMESTRUCT s;
と私はのような機能を持っていると言う:この機能を使用するためには
template<typename RevFwdIt>
std::pair<RevFwdIt, RevFwdIt> some_slice_rev(RevFwdIt rbegin, RevFwdIt rend)
{
RevFwdIt it = basename_rev(rbegin, rend);
RevFwdIt e = std::find(rbegin, it, 5);
return std::make_pair(e == it ? rbegin : e, it);
}
、私は
some_slice_rev(&s.elements[s.count - 1], &s.elements[-1]);
どの言う必要があります(IMHO)は、off-by-oneエラーのために、醜く、エラーを起こしやすい。
一方で、私は単にそれからstd::find
は終わりの代わりに最初から検索してしまうため(より良い)
some_slice(&s.elements[0], &s.elements[s.count]);
を使用するsome_slice
にsome_slice_rev
を変更することはできません。
一方、std::find
が未処理のポインタである「逆イテレータ」をどのように処理するのかわからないので、コード自体はすでに壊れています。
このような状況でコードを修正する最もよい方法は何ですか? rawポインタである逆イテレータを扱う方法はありますか?または、これを修正するための標準的なリファクタリングメカニズムがありますか?以外はSOMESTRUCT
を変更していますか?
ああ...うわー。私はそれが内部的にインスタンス化されなければならないと思ったように 'reverse_iterator'をインスタンス化することが合法だとは知らなかった。 +1すると便利です。しかし、フォローアップ: 'some_slice_rev'の周りに' some_slice'ラッパーを作成する一般的な方法を知っていますか? (私は単純に 'some_slice(make_reversed(end-1)、make_reversed(begin-1))'と呼ぶことはできません)。 – Mehrdad
@Mehrdad:私は戻ってくるのでしょうか?それを理解していない。 :)おそらく 'std :: reverse_iterator'が' base() '関数を持っていることを知っていると、根底にあるイテレータを得るために、あなたの質問に答えるのに役立ちます。 – GManNickG
申し訳ありませんが、私はそれをもっと明確にしようとします:問題は、Cスタイルの配列で 'find'を使用できるようにすることですが、配列の最後から始めることです。もちろん、ポインタを使用するCスタイルの配列では機能しない点を除いて、逆のイテレータ( 'rbegin()'と 'rend()')を持つコンテナでも動作します。 ** XYZ_rev'関数を作るのではなく、フォワードイテレータを使ってこれを行う関数 'XYZ'を作成するのが好きですが、良い方法はわかりません。助言がありますか? – Mehrdad