gpt4 book ai didi

c++ - 在 C++ 中将 begin() 和 end() 与集合一起使用

转载 作者:太空宇宙 更新时间:2023-11-03 10:34:23 25 4
gpt4 key购买 nike

我正在尝试使用迭代器遍历一个集合,然后对该集合的成员(如果有的话)做一些事情。问题是,通常这行得通,但有时,它会比较空集的开头和结尾,发现它们不相等。

感兴趣的代码片段是:

    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,程序正常运行。

附言命令 verlet_vars.verlet()[i] 调用集合 vector ,因此 [i]

verlet() 函数:

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

感谢您的宝贵时间。

最佳答案

您的 verlet_vars.verlet() 函数按值返回,因此您实际上有两个不同的集合 vector 。 Comparing iterators of two different containers is undefined.这意味着某些代码安排似乎总是有效,但如果确实如此,您仍然很幸运。

一些备选方案:

  • 让函数返回一个 vector 引用:

    std::vector<std::set<int> > const& verlet() const {return _verlet;}
  • 调用该函数一次以获取 vector (或集合)的本地拷贝,然后在循环期间处理本地拷贝:

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

关于c++ - 在 C++ 中将 begin() 和 end() 与集合一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7236218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com