2011-08-29 154 views
1

我正在尝试使用迭代器遍历一个集合,然后对该集合的成员(如果有的话)执行某些操作。问题是,通常这是有效的,但有时候,它会比较空集的开始和结束,并发现它们不相等。在C++中使用begin()和end()

感兴趣的代码段是:

for(int i=0;i<input_data.num_particles();i++) 
    { 
     //loop through pairs contained in particle i's Verlet list 
     set<int>::iterator iter; 
     for(iter=verlet_vars.verlet()[i].begin();iter!=verlet_vars.verlet()[i].end();iter++) 
     { 
      //call the force() function to calculate the force between the particles 
      force(particles.getpart(i),particles.getpart(*iter),input_data,*iter); 
     } 
    } 

有时,即使)载于verlet_vars.verlet(设定的[i]是空的,程序迭代进行比较,以设定的端部,并发现它们不相等,因此它进入内部循环(最终通过尝试调用force()函数导致程序崩溃)。什么是奇怪的是,如果我做任何迭代器内循环调用之前,喜欢做这样的事情:

iter=verlet_vars.verlet()[i].begin(); 

那么,对于内环的比较总是返回true,程序正常运行。

P.S.命令verlet_vars.verlet()[I]调用的集合的矢量,因此[I]

的verlet的()函数:

std::vector<std::set<int> > verlet() const {return _verlet;} 

感谢您的时间。

+0

这是一个单线程程序吗? 'force()'或'getpart()'是否修改集合? –

+1

您确定要使用'input_data'来确定'verlet_vars.verlet()'中的元素个数吗?为什么不从0到'verlet_vars.verlet()。size()'? –

+0

我们可以看到verlet()函数吗? –

回答

8

verlet_vars.verlet()通过值函数返回,所以你确实有套在播放两个不同的载体。 Comparing iterators of two different containers is undefined.这意味着代码的某些安排可能总能正常工作,但如果确实如此,您仍然是幸运的。

一些替代方案:

  • 使函数返回一个向量参考,而不是:

    std::vector<std::set<int> > const& verlet() const {return _verlet;} 
    
  • 调用该函数一旦获得向量的本地副本(或一组),然后在回路中处理本地副本:

    std::set<int> verlet_i = verlet_vars.verlet()[i]; 
    set<int>::iterator iter; 
    for(iter=verlet_i.begin();iter!=verlet_i.end();iter++) 
    
+2

你可能想要返回const参考 –

+0

好眼Rob,永远不会想到了这一点。 +1 –

+0

作为一个常数引用返回似乎有固定的问题。非常感谢。 – Kyle

0

它可能并不重要,具体取决于您的编译器是否复制或返回值。您应该在返回类型verlet()上使用const引用。如果不是这样,你可能最终会在每次调用时接收到不同的副本,(取决于实现)可能导致迭代器没有完全比较(例如,将集合的迭代器与另一个集合的结束迭代器进行比较,因为每个当你打电话给verlet()你得到一套不同的副本。)

相关问题