C++中类的私有成员-数组-输出异常,求指教
C++中类的私有成员-数组-输出错误,求指教
在编写GA算法的时候,定义了一个类名为Chromo().
问题:cout<<vecPopulation[i].genestr<<endl;是错误的,如果用for遍历输出为1100011011,则输
出为0036A418,不知道为什么。但是如果用for语句遍历输出是正确的。求指教。。。还有部分运行输出,稍后贴出。
我的目的就是初始化GA的初始种群的genestr为只含有0,1的串,方法是:1,初始为全0串,2,选择串长度内的一个随机数
字作为其中1的数目,3,不重复的选取数组的索引,将指定位置初始化为1。
部分类的定义如下
class Chromo
{
private:
int genestr[10];
};
vector<Chromo> vecPopulation;
vecPopulation.clear;
for (int i=0; i<popSize; i++)
{
vecPopulation.push_back(Chromo());
//初始化基因链为全0串
for(int k=0;k<chromoLength;k++)
{vecPopulation[i].genestr[k]=0;out_test<<vecPopulation[i].genestr[k];}
out_test<<"初始化的基因链: "<<vecPopulation[i].genestr<<endl;
srand( (unsigned)time(NULL) );//srand()函数产生一个以当前时间开始的随机种子
int min_gene=3;
int gene_num=min_gene+rand()%(chromoLength-min_gene+1);//被选择的基因的总数目,范围是
[1,chromoLength],被选择节点的最小数目需要修改,比如5
cout<<"基因位为1的总数目: "<<gene_num<<endl;
out_test<<"基因位为1的总数目: "<<gene_num<<endl;
int j=0;
while(j<gene_num)
{
int flag=1;//指定位置的数据设置为1,其他位置应该默认为0,待检查
srand( (unsigned)time(NULL) );
int gene_chosen=rand()%chromoLength;//被选择的基因位置,范围是[0,chromoLength)
if(vecPopulation[i].genestr[gene_chosen]==0)
{
cout<<gene_chosen<<endl;//输出检查被选择的基因位
out_test<<"被选择的基因位: "<<gene_chosen<<endl;
vecPopulation[i].genestr[gene_chosen]=flag;
j++;
}
}
//直接输出cout<<vecPopulation[i].genestr<<endl;是错误的,如果用for遍历输出为1100011011,则输
出为0036A418,不知道为什么。
for(int m=0;m<10;m++)
cout<<vecPopulation[i].genestr[m];//输出这条染色体的基因链
cout<<vecPopulation[i].genestr<<endl;
out_test<<"生成的基因链: "<<endl;
for(int m=0;m<10;m++)
out_test<<vecPopulation[i].genestr[m];
}
------解决思路----------------------
数组作为参数调用operator<<时,有一个到指针类型的隐式转型,因此上调用的是operator<<(ostram&, int*)。对于指针类型的输出,标准库只对char *系统指针进行了特殊处理,把它们理解为字符串并输出文本内容,其它类型指针一律以16进制输入地址,而并不会输入数组内容。
要想输入数组内容,最简单的办法就是循环输出。
------解决思路----------------------
不可能。
除了用于&、sizeof等极少数操作符以外,其它任何时候使用一个数组时,它都会被隐式转型为指针类型,因此ostream::opreator<<无法知道数组的长度,不可能正确地输出完整的数组内容。
在编写GA算法的时候,定义了一个类名为Chromo().
问题:cout<<vecPopulation[i].genestr<<endl;是错误的,如果用for遍历输出为1100011011,则输
出为0036A418,不知道为什么。但是如果用for语句遍历输出是正确的。求指教。。。还有部分运行输出,稍后贴出。
我的目的就是初始化GA的初始种群的genestr为只含有0,1的串,方法是:1,初始为全0串,2,选择串长度内的一个随机数
字作为其中1的数目,3,不重复的选取数组的索引,将指定位置初始化为1。
部分类的定义如下
class Chromo
{
private:
int genestr[10];
};
vector<Chromo> vecPopulation;
vecPopulation.clear;
for (int i=0; i<popSize; i++)
{
vecPopulation.push_back(Chromo());
//初始化基因链为全0串
for(int k=0;k<chromoLength;k++)
{vecPopulation[i].genestr[k]=0;out_test<<vecPopulation[i].genestr[k];}
out_test<<"初始化的基因链: "<<vecPopulation[i].genestr<<endl;
srand( (unsigned)time(NULL) );//srand()函数产生一个以当前时间开始的随机种子
int min_gene=3;
int gene_num=min_gene+rand()%(chromoLength-min_gene+1);//被选择的基因的总数目,范围是
[1,chromoLength],被选择节点的最小数目需要修改,比如5
cout<<"基因位为1的总数目: "<<gene_num<<endl;
out_test<<"基因位为1的总数目: "<<gene_num<<endl;
int j=0;
while(j<gene_num)
{
int flag=1;//指定位置的数据设置为1,其他位置应该默认为0,待检查
srand( (unsigned)time(NULL) );
int gene_chosen=rand()%chromoLength;//被选择的基因位置,范围是[0,chromoLength)
if(vecPopulation[i].genestr[gene_chosen]==0)
{
cout<<gene_chosen<<endl;//输出检查被选择的基因位
out_test<<"被选择的基因位: "<<gene_chosen<<endl;
vecPopulation[i].genestr[gene_chosen]=flag;
j++;
}
}
//直接输出cout<<vecPopulation[i].genestr<<endl;是错误的,如果用for遍历输出为1100011011,则输
出为0036A418,不知道为什么。
for(int m=0;m<10;m++)
cout<<vecPopulation[i].genestr[m];//输出这条染色体的基因链
cout<<vecPopulation[i].genestr<<endl;
out_test<<"生成的基因链: "<<endl;
for(int m=0;m<10;m++)
out_test<<vecPopulation[i].genestr[m];
}
------解决思路----------------------
数组作为参数调用operator<<时,有一个到指针类型的隐式转型,因此上调用的是operator<<(ostram&, int*)。对于指针类型的输出,标准库只对char *系统指针进行了特殊处理,把它们理解为字符串并输出文本内容,其它类型指针一律以16进制输入地址,而并不会输入数组内容。
要想输入数组内容,最简单的办法就是循环输出。
------解决思路----------------------
不可能。
除了用于&、sizeof等极少数操作符以外,其它任何时候使用一个数组时,它都会被隐式转型为指针类型,因此ostream::opreator<<无法知道数组的长度,不可能正确地输出完整的数组内容。