2012-02-12 118 views
0

我有下面的代码在我的项目:迭代与非迭代循环,不同的输出,C++

std::cout << "Without iterator:\n"; 

std::vector<RectangleCluster*> rc = p->getInnerRegionPolygons().at(0)->getClusters(); 

for (int i = 0; i < rc.size(); i++) 
    std::cout << "Cluster " << rc.at(i)->getId() << ": start = " << rc.at(i)->getOverlapAtStart() << ", end = " << rc.at(i)->getOverlapAtEnd() << std::endl; 

std::cout << "\n\nWith iterator:\n"; 

for (std::vector<RectangleCluster*>::iterator ci = p->getInnerRegionPolygons().at(0)->getClusters().begin(); ci != p->getInnerRegionPolygons().at(0)->getClusters().end(); ++ci) 
    std::cout << "Cluster " << (*ci)->getId() << ": start = " << (*ci)->getOverlapAtStart() << ", end = " << (*ci)->getOverlapAtEnd() << std::endl; 

控制台输出看起来是这样的:

没有迭代器:
集群0:开始= 65.4238,端= 64.9811
群集1:开始= 64.9811,端= 17.9983
群集2:开始= 17.9983,端= 17.9983 ...

随着迭代:
群集34026352:开始= 1.68113e-316,末端= 1.68113e-316
群集1:开始= 64.9811,端= 17.9983
群集2:开始= 17.9983,端= 17.9983 ...

“...”之后的输出也相同。为什么没有迭代器的代码给我“集群0:开始= 65.4238,结束= 64.9811”和迭代器“集群34026352:开始= 1.68113e-316,结束= 1.68113e-316”的代码?

for (std::vector<RectangleCluster*>::iterator ci = rc.begin(); ci != rc.end(); ++ci) 
    std::cout << "Cluster " << (*ci)->getId() << ": start = " << (*ci)->getOverlapAtStart() << ", end = " << (*ci)->getOverlapAtEnd() << std::endl; 

我同意awoodland的评论:

问候 的Gernot

+2

这里没有足够的信息来说明任何确定性。 (通常一个*最小的*完整的例子使问题更容易回答)。在(0) - > getClusters()是否通过值或引用返回'p-> getInnerRegionPolygons()。我打赌前者 – Flexo 2012-02-12 10:04:28

+0

如果这是有价值的,你的迭代器初始化为一个向量副本,检查是针对另一个副本的另一个迭代器结束!不知道在这种情况下有什么效果。你可以尝试通过初始化数组到单个变量并使用迭代器或暴露p-> getInnerRegionPolygons()。at(0)的接口来提供迭代器? – PermanentGuest 2012-02-12 10:32:33

回答

3

请像迭代器重写代码。在(0) - > getClusters()中,最有可能的是p-> getInnerRegionPolygons()。每次调用都会返回新的向量。从(...)运算符的不同容器内部比较迭代器是不正确的。