strite.cc

strcpy(dst, src);

じゃなくて

copy(src, src+strlen(src)+1, dst);

を使うのはなんかおかしいと思う。まず +1 を忘れるとか。いやそれは私が忘れてただけなんですが。そんなことはどうでも良くて、 strlen を呼んでるのがおかしい。なんで文字列をコピーするのに二度全体をなめるの、と。 C++ の、 C より遅くなってはいけない、っていう貧乏症至上命題が浸透してれば、 copy&strlen は気持ち悪い、と思う。

というわけでちょっとマシ?な物体 strite を考えました。

#include <cassert>
#include <cstring>
#include <algorithm>
using namespace std;

class strite : public iterator_traits<const char*> {
    const char* p;
public:
    typedef forward_iterator_tag iterator_category;
    strite() : p(0) {}
    strite(const char* s) : p(s) {}
    void operator++() {
        if (!*p) p = 0;
        else p++;
    }
    char operator*() { return *p; }
    bool operator==(strite& r) { return p==r.p; }
    bool operator!=(strite& r) { return p!=r.p; }
};

int main() {
    const char* src = "hoge";
    char dst[256];
//    strcpy(dst, src);
//    copy(src, src+strlen(src)+1, dst);
    copy(strite(src), strite(), dst);
    assert(!strcmp(src, dst));
    return 0;
}

実装は適当です。めんどくさいから forward_iterator になってるとか。 end の状態から -- できないのがアレですがまぁいいとしようかと思います。他の解もいくつか考えましたが効率が一番落ちなさそうなのを選びました。これでも比較が1回多くなっちゃうのでやはり strcpy が正解だと思いました。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h