0

我现在已经对这段代码进行了大量的错误检查,并确保我输出了“正确”的东西来概述问题。迭代器根本不指向列表,而是另一组包含正确数据的地址。

我有两个问题:

1 = 给定 couts 的形式,我是否输出了正确的项目来调查为什么这个循环没有退出;

2 = if(1) 那么是什么产生了这个输出,你有什么建议可以进一步了解我的指针知识吗(我之前已经多次使用这种 for 循环格式,这从未发生过;

/问题

代码 :

#include "neutronFileReader.h"

using namespace std ;

neutronFileReader::neutronFileReader()
{
}

list<vector<float> > neutronFileReader::spectrum(char* filename)
{
ofstream addresses ;
addresses.open("adresses.txt") ;
ifstream fin(filename) ;
string binhi, binlo ;
list<vector<float> > neutronSpectrum ;
list<vector<float> >::iterator nS ;
vector<float> EnergyProbability ;

while(!fin.eof())
{
    EnergyProbability.clear() ;
    getline(fin, binlo, ' ') ;      //get the binlo string
    getline(fin, binhi, ' ') ;      //get the binhi string

    EnergyProbability.push_back(atof(binhi.c_str())+(atof(binhi.c_str()) -  atof(binlo.c_str()))/2) ; //store middle of bin as emission Energy

    getline(fin, binlo) ;       //try not to waste memory space

    EnergyProbability.push_back(atof(binlo.c_str())) ; //store emnission probability
    neutronSpectrum.push_back(EnergyProbability) ; //put the vector in the list
 }

 for(nS = neutronSpectrum.begin() ; nS != neutronSpectrum.end() ; nS++)  //go through the neutron spectrum
 {
     EnergyProbability = (*nS) ;
     addresses << &neutronSpectrum.begin() << " : " << &(*nS) << " : " << &neutronSpectrum.end() << endl ;    // print energy & prob to screen
     cout << &neutronSpectrum.begin() << " : " << &(*nS) << " : " << &neutronSpectrum.end() << endl ;
 }

 return neutronSpectrum ;
 }

这是输出:

0x28fbc4 : 0x510c38 : 0x28fbc0
0x28fbc4 : 0x510c58 : 0x28fbc0
0x28fbc4 : 0x510c78 : 0x28fbc0
0x28fbc4 : 0x510c98 : 0x28fbc0
0x28fbc4 : 0x510cb8 : 0x28fbc0
0x28fbc4 : 0x510cd8 : 0x28fbc0
0x28fbc4 : 0x510cf8 : 0x28fbc0
0x28fbc4 : 0x510d18 : 0x28fbc0
0x28fbc4 : 0x510d38 : 0x28fbc0
0x28fbc4 : 0x510d58 : 0x28fbc0
0x28fbc4 : 0x510d78 : 0x28fbc0
0x28fbc4 : 0x510d98 : 0x28fbc0
0x28fbc4 : 0x510db8 : 0x28fbc0
0x28fbc4 : 0x510dd8 : 0x28fbc0
0x28fbc4 : 0x510df8 : 0x28fbc0
0x28fbc4 : 0x510e18 : 0x28fbc0
0x28fbc4 : 0x510e38 : 0x28fbc0
0x28fbc4 : 0x510e58 : 0x28fbc0
0x28fbc4 : 0x510e78 : 0x28fbc0
0x28fbc4 : 0x510e98 : 0x28fbc0
0x28fbc4 : 0x510eb8 : 0x28fbc0

非常感谢。

4

3 回答 3

1

如果我错了,请纠正我,但第 1 列和第 3 列不是表示指向 begin() 和 end() 返回的迭代器实例的指针,而不是指向(列表的)对象本身的指针吗?

于 2010-12-04T12:29:32.033 回答
0

我自己刚刚发现了这一点,但似乎list.end()返回的迭代器没有指向有效元素。它指向过去的元素。

为了让我们能够正确理解发生了什么,您应该输出list.back()确实指向列表中的最后一个元素。请注意, list.back() 不返回迭代器,而是直接引用最后一项(因此您应该简单地打印返回的内容而不取消引用)。

于 2010-12-04T14:29:56.780 回答
0

好的,它似乎工作正常(根据最后一个例子)。

它到达最后一个元素然后停止(带有 while 的元素永远不会到达最后一个元素,因为它们在最后一个元素上的条件失败)。

这里的关键是 .end() 和 .back() 指向不同的东西,因此可以预期地址的差异。

.back() 引用列表的最后一个元素。.end() 引用了一个过去最后一个元素,它仅在处理最后一个元素后才停止循环(与以下情况相反:

while(&(*nS) != lastListElement) {
/*...*
}

这导致循环在分析最后一个元素之前停止。

据我所知,您唯一的问题是地址的输出,对吗?或者循环没有退出它应该去的地方?

于 2010-12-04T17:33:07.207 回答