Kyl*_*yle 1 c++ set stdvector stdset
我正在尝试使用迭代器来完成一个集合,然后对该集合的成员做一些事情(如果有的话).问题在于,通常这是有效的,但有时,它会比较空集的开头和结尾,并发现它们不相等.
感兴趣的代码段是:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
有时,即使verlet_vars.verlet()[i]中包含的集合为空,程序也会将迭代器与集合的末尾进行比较并发现它们不相等,因此它进入内部循环(最终导致程序崩溃)通过尝试调用force()函数).奇怪的是,如果我在调用内部循环之前对迭代器做了什么,比如做类似的事情:
iter=verlet_vars.verlet()[i].begin();
Run Code Online (Sandbox Code Playgroud)
然后,内部循环的比较总是返回true,程序正常运行.
PS命令verlet_vars.verlet()[i]调用集合的向量,因此[i]
verlet()函数:
std::vector<std::set<int> > verlet() const {return _verlet;}
Run Code Online (Sandbox Code Playgroud)
谢谢你的时间.
您的verlet_vars.verlet()函数按值返回,因此您实际上有两个不同的集合向量.比较两个不同容器的迭代器是不确定的.这意味着某些代码安排似乎总是有效,但如果确实如此,你仍然很幸运.
一些替代品:
使函数返回向量引用:
std::vector<std::set<int> > const& verlet() const {return _verlet;}
Run Code Online (Sandbox Code Playgroud)调用该函数一次以获取向量(或集合)的本地副本,然后在循环期间处理本地副本:
std::set<int> verlet_i = verlet_vars.verlet()[i];
set<int>::iterator iter;
for(iter=verlet_i.begin();iter!=verlet_i.end();iter++)
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
1193 次 |
| 最近记录: |