【问题标题】:C++ Printing an array containing data structuresC++ 打印包含数据结构的数组
【发布时间】:2018-10-06 03:19:47
【问题描述】:

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

我想要做的是打印“人口”数组,我得到的错误是“没有运算符“

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

【问题讨论】:

    标签: c++ arrays printing cout


    【解决方案1】:

    问题是您正在尝试 cout 结构,而在 C++ 中,此操作仅针对原始类型(int、char、char*、...)定义,除非您自己重载

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

    示例

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

    【讨论】:

      【解决方案2】:

      您必须重载 operator &lt;&lt; 并使用 ostream 和 struct 个体作为参数,以便您可以直接调用 cout。这是一个sn-p:

      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;
      }
      

      【讨论】:

        【解决方案3】:

        这是实现目标的C++11 方法。正如@seccpur 强调的那样,最好的方法是重载&lt;&lt; 通量运算符。我冒昧地使用class 而不是struct 稍微改变了您的代码。它还将向您展示&lt;&lt;flux 运算符在玩类时的另一种用法。

        #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);
        

        运算符重载被声明为Individual classfriend,以便访问其私有成员。

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

        srand(time(NULL)); // Needed one time.
        rand() % 2;        // Can be used multiple time
        

        【讨论】:

          猜你喜欢
          • 2015-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多