アトリエ ぺっぺ

トップページ > プログラムTips > vectorの使用方法2

◆ vectorの使用方法2
vectorのような配列から、ある一定の条件のものを削除するとき、まともに0番目から最後まで回していくと、消した後に配列をつめたり、ループカウンタを調整したり、面倒だと思いませんか?

例えば、あるvectorがあって、その中から条件に一致するものを削除する場合、こんなことをしていませんか?
void DeleteHoge(vector<int>& vnSrc){
    int nCount((int)vcSrc.size());
    for(int i = 0; i < nCount; i++){
        if(vnSrc[i] == 1){
            vnSrc.erase(vnSrc.begin() + i);
            i --;
            nCount = (int)vnSrc.size();
        }
    }
}
vectorはeraseで要素を削除すれば自動的に要素をつめてくれるので楽チンですが、それでもループカウンタを調整したり、最大ループカウントをいじくったりして、分かりにくいですね。

人により好みが分かれると思いますが、私は以下のようにして、なるべく削除した後のことを考えなくても良いようにしています。
void DeleteHoge(vector<int>& vnSrc){
    for(int i = (int)vcSrc.size() - 1; i > -1; i--){
        if(vnSrc[i] == 1){
            vnSrc.erase(vnSrc.begin() + i);
        }
    }
}
違いが分かるでしょうか。
配列から一要素除くと、つめる必要がある(順番が変わる)のは『削除した場所から後ろの要素』です。
つまり、要素を削除した後に、そこより後ろにアクセスしなければ、不都合は起きません。
上の例では、配列の後ろから前へループさせる事により、削除後のわずらわしさをなくしているのですね。


ただ、後ろからまわすということにあまり慣れていない人にとっては、微妙に見づらいかもしれません。
この辺りは好みになりますので、自分が一番納得できる方法で組むことをオススメします。


(C) 2002 atelier-peppe
ababa@atelier-peppe.sakura.ne.jp