我目前是使用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 <<个人,而我没有了解如何解决此问题。
非常感谢任何帮助或解决方案,谢谢!
答案 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()