C ++打印包含数据结构的数组

时间:2018-10-06 03:19:47

标签: c++ arrays printing cout

我目前是使用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");
}

我想做的是打印'population'数组,我得到的错误是'没有运算符“ <<”匹配这些操作数,操作数类型为std :: ostream <<个人,而我没有了解如何解决此问题。

非常感谢任何帮助或解决方案,谢谢!

3 个答案:

答案 0 :(得分:1)

问题是您正在尝试cout结构,并且在C ++中,此操作仅针对基本类型(int,char,char *,...)定义,除非您自己重载<<运算符。

您可能想要的是输出结构中包含的原始数据类型。

示例

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

答案 1 :(得分:1)

您必须重载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; } ,并在结构个体旁边使用ostream作为参数,以便可以直接调用cout。这是一个片段:

tr

答案 2 :(得分:0)

这是实现目标的一种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的{​​{1}}中声明了操作符重载。

此外,请注意class函数。按原样使用,它将始终生成相同的数字。您应该为数字生成器提供种子。其用法之一可以是:

rand()