私はAcceleratec++の運動問題を解いていました。
§8.2.5/148で使用したスワップ関数を実装します。*begと*endの値を直接交換するのではなく、なぜスワップを呼び出すのですか?ヒント:試してみてください。
本の実際の機能は
template<class Bi> void reverse(Bi begin, Bi end) {
while (begin != end) {
--end;
if (begin != end)
swap(*begin++, *end);
} }
これに変えました
template<class Bi,class X>
void reverse(Bi b, Bi e)
{
X tmp;
while (b!= e) {
--e;
if (b != e)
{
tmp=*b;
*b=*a;
*a=tmp;
--b;
}
}
}
そしてそれは動作しませんでした、次のエラーを出しました。
reverse(std :: vector :: iterator、std :: vector :: iterator)を呼び出すための一致する関数がありません '
私がこれに変えたより
template<class Bi,class X>
void reverse(Bi b, Bi e,X c)
{
X tmp=c;
while (b!= e) {
--e;
if (b != e)
{
tmp=*b;
*b=*a;
*a=tmp;
--b;
}
}
}
上記の関数を次のように呼び出します
reverse(v.begin(),v.end(),0);
そしてそれは機能しました、しかし私はまだ2番目のものが機能しない理由を理解していませんでしたか?