C ++ Печать массива, содержащего структуры данных - PullRequest
0 голосов
/ 06 октября 2018

В настоящее время я новичок в использовании C ++, и у меня возникли проблемы с попыткой выяснить, как напечатать массив структур данных.Я искал вокруг, чтобы попытаться найти решение для этого, однако, я потерпел неудачу.Ниже приведен мой код:

#include <iostream>
#include <string>
using namespace std;
int P = 5;
int N = 5;

//Create individual
typedef struct 
{
    int gene[5];    
    int fitness;
} individual;

//Population array contains all individuals
individual population[5];

//Initialize genes and fitness level of each individual in the the 
population
int initializeGenes()
{
    for (int i = 0; i < P; i++) {
        for (int j = 0; j < N; j++) {
            population[i].gene[j] = rand() % 2;
        }
        population[i].fitness = 0;
    }
    return 0;
}

int main()
{
    initializeGenes();

    for (int i = 0; i < P; i++)
    {
        cout << population[i];
    }
    system("pause");
}

То, что я хочу сделать, это распечатать массив «население», и я получаю сообщение об ошибке «нет оператора» << соответствует этим операндам, типы операндов являются стандартными:: ostream << индивидуальный ", и я не понимаю, как это исправить. </p>

Любая помощь или решение будет очень признателен, спасибо!

Ответы [ 3 ]

0 голосов
/ 06 октября 2018

Вы должны перегрузить operator << и использовать ostream вместе со структурным индивидом в качестве параметров, чтобы вы могли напрямую вызывать cout.Вот фрагмент кода:

ostream& operator << (ostream& os, const individual& ind)
{
    os << "Gene = ";
    for (int i = 0; i < 5; i++)
    {
        os << ind.gene[i] << " ";
    }
    os << "Fitness = " << ind.fitness <<'\n';
    return os;
}
0 голосов
/ 06 октября 2018

Вот C++11 способ достижения вашей цели.Как подчеркивает @seccpur, лучший способ - перегрузить оператор потока <<.Я взял на себя смелость и немного изменил ваш код, используя class вместо struct.Он также покажет вам еще одно использование оператора потока << при игре с классами.

#include <iostream>
#include <string>
#include <vector>
#include <random>

class Individual
{
public:
    Individual() : fitness(0)
    {
        gene.reserve(5);
        std::random_device random_dev;
        std::mt19937  generator(random_dev());
        std::uniform_int_distribution<int> distr(0, 100);
        for (std::size_t i = 0; i < 5; ++i)
            gene.push_back(distr(generator) % 2);
    }

    ~Individual() {};

private:
    std::vector<int> gene;    
    int fitness;

private:
    friend std::ostream& operator<<(std::ostream& stream, const Individual& individual); 
};

std::ostream& operator <<(std::ostream& stream, const Individual& individual)
{
    stream << "Gene = ";
    for (std::size_t i = 0; i < individual.gene.size(); ++i)
        stream << individual.gene[i] << " ";
    stream << "Fitness = " << individual.fitness <<'\n';
    return stream;
}

std::vector<Individual> population(5);

int main()
{
    for (int i = 0; i < population.size(); i++)
        std::cout << population[i];

    return 0;
}

В приведенном выше примере вы должны абсолютно объявить следующее:

friend std::ostream& operator<<(std::ostream& stream, const Individual& individual);

Перегрузка оператора объявляется friend из Individual class для доступа к его закрытым элементам.

Также позаботьтесь о функции rand().Используйте как есть, он всегда будет генерировать одинаковые числа.Вы должны предоставить семя для генератора чисел.Один из его использования может быть:

srand(time(NULL)); // Needed one time.
rand() % 2;        // Can be used multiple time
0 голосов
/ 06 октября 2018

Проблема в том, что вы пытаетесь создать структуру, и в C ++ это действие определено только для примитивных типов (int, char, char *, ...), если вы сами не перегружаете оператор <<. </p>

Вероятно, вам нужно вывести примитивные типы данных, содержащиеся в структуре.

Пример

for (int i = 0; i < 5; i++) {
    cout << population[i].gene[i] << endl;
}
cout << population[i].fitness << endl;
...