2

こんにちは私はC++で遺伝的アルゴリズムを作成しようとしていますが、コンテナとしてベクトルを使用しようとしました。問題は、ベクトルに次のようなクラス引数があるため、ベクトルのサイズを設定する方法がわからなかったことです。

class population
{
    friend class chromosome;
private:
    int population_number;
    int best_index[2];
    vector <chromosome *> chromosome_population;
public:
    population(int numberOfPopulation);
    population(int numberOfPopulation,int numberOfSynapse);
    ~population();
    int worst_chromosome();
    void mating();
    void crossover(int parent_1,int parent_2);
};

これは人口クラスであり、これが染色体クラスです

class chromosome
{
    friend class population;
private:
    int chromosome_id;
    float fitness;
    vector <gen *> gen_chromosome;
public:
    chromosome();
    ~chromosome();
    void fitness_function();
    void mutation_translocation();
    int get_chromosome_size();
};

ポピュレーションクラスコンストラクターでベクトルの長さを設定するにはどうすればよいですか?vector.pushbackとvector.resizeを使用しようとしましたが、引数が一致しないため、どちらもエラーになります。実際、なぜエラーになるのかは理解していますが、ベクトルプッシュバック内の引数を一致させる方法がわかりませんでした。これが私の人口コンストラクターです。

population::population(int numberOfPopulation)
{
    srand (time(NULL));
    population_number = numberOfPopulation;
    for(int a=0;a<population_number;a++)
    {
        chromosome_population.push_back();
    }
    cout<<chromosome_population.size();
    for(int i=0;i<population_number;i++)
    {
        chromosome_population[i]->chromosome_id = i;
        int chromosome_length = rand() % 10 + 1;
        for(int j=0;j<chromosome_length;j++)
        {
            chromosome_population[i]->gen_chromosome[j]->basa_biner = rand()%1;
            chromosome_population[i]->fitness = (rand()%99)+1;
        }
    }
}

他に必要な情報があれば、コメントで教えてください。必要な情報を追加します。前に感謝します。

4

1 に答える 1

6

std::vectorにはいくつかのコンストラクターがあり、バリアントの1つはに格納される要素の初期数を受け入れますvector

コンストラクターの初期化子リストvectorでのサイズを指定します。population

population::population(int numberOfPopulation) :
    population_number(numberOfPopulation),
    chromosome_population(numberOfPopulation)
{
}

このアプローチを与えると、population_numberメンバー変数は。によって取得できるため不要chromosome_population.size()です。

に初期サイズを指定すると、 nullポインタvectorが含まれることになります。numberOfPopulationの要素にアクセスする前に、vectorオブジェクトを作成する必要があります。この場合は、を使用しnewます。要素がコピー可能であり、ポリモーフィックな動作が必要ない場合は、vector<chromosome>代わりに使用することをお勧めします。で動的に割り当てられた要素を使用する必要がある場合は、vector最初に割り当てる必要があります。

chromosome_population[i] = new chromosome();

delete不要になったときに覚えておいてください。

また、生のポインターの代わりにスマートポインターの形式を使用することも望ましいです。スマートポインタを使用する利点はvector<unique_ptr<chromosome>>、スコープ外になると、各要素を明示的に呼び出す必要なしに、要素が破棄されることですdelete利用可能なC++スマートポインタの実装を参照してください。利用可能なスマートポインタの便利なリストについては。

vector::push_back()要素と同じ型の引数を受け入れることに注意してください。したがって、の正しい呼び出しpush_back()は次のとおりです。

chromosome_population.push_back(new chromosome());

vectorat構文の初期サイズを指定すると、呼び出しは、の初期(この場合はnullポインター)要素のpush_back()に要素を追加します。vector

于 2012-11-19T09:28:40.790 に答える