迭代器问题仍在继续

时间:2010-12-04 12:14:47

标签: c++ iterator memory-address

我有错误检查此代码,并确保我输出'正确'的东西来概述问题。迭代器根本不会指向列表,而是另一堆地址,它们很乐意包含正确的数据。

我有两个问题:

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

2 =如果(1)然后发生了什么产生这个输出你是否有任何建议来进一步提高我的指针知识(我之前已多次使用这种循环格式,这从未发生过;

/问题

代码:

#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

非常感谢。

3 个答案:

答案 0 :(得分:1)

如果我错了,请纠正我,但第1和第3列是否代表指向begin()和end()返回的迭代器实例的指针,而不是指向(列表中的)对象的指针?< / p>

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

.back()引用列表的最后一个元素。 .end()引用了一个past-last-element,用于仅在处理完最后一个元素后停止循环(与以下内容相反:

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

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

从我能收集的内容来看,您唯一的问题是地址的输出对吗?或者周期没有退出应该在哪里?