読者です 読者をやめる 読者になる 読者になる

vector の要素削除とシャッフル

C/C++

追記、修正あり

ベクトルvのn番目の要素を削除

v.erase(v.begin()+n);

ベクトルvから特定の要素を全て削除、ここではvは整数のベクトルとし3を削除するとする。

std::vector<int>::iterator it = remove(v.begin(), v.end(), 3);
v.erase(it, v.end());

追記 remove を使うには algorithm を include する

応用としてベクトルのシャッフルをやってみる。

#include <iostream>
#include <vector>
#include <stdlib.h>

// [min, max] の範囲の整数の乱数を生成
int random(int min, int max)
{
    int M = max - min +1;

    return min + rand() % M;
};

int main(int argc, char** argv)
{
    std::vector<int> v, result;

    int array_size = 10;

    // 乱数の種
    srand((unsigned)time(NULL));

    // 元の配列を用意
    for (int i=0; i<array_size; i++) v.push_back(i);

    // 元の配列を表示
    std::vector<int>::iterator it;
    for (it = v.begin(); it != v.end(); it++) std::cout << *it << " ";
    std::cout << std::endl;

    // シャッフル
    for (int i=0; i<array_size; i++) {

        // 元の配列から適当な要素を選んで結果に追加
        int n = random(0, v.size()-1);
        result.push_back(v.at(n));

        // 元の配列から要素を削除
        v.erase(v.begin()+n);
    }

    // シャッフルした結果を表示
    for (it = result.begin(); it != result.end(); it++) std::cout << *it << " ";
    std::cout << std::endl;

    return 0;
}

追記
コンパイラーが c++11 に対応していれば -std=c++11 オプションで STL の algorithm にある shuffle 関数を使える