c++ - 惯用STL : Iterating over a list and inserting elements

标签 c++ stl iterator

我正在编写一种算法,它遍历一个点列表,计算它们之间的距离,如果距离太大,则插入额外的点。但是,我似乎对 STL 缺乏适当的了解,无法提出一个优雅的解决方案。我希望我能学到一些东西,所以我会向您展示我的代码。你可能会给我一些提示。

for (std::list<PathPoint>::iterator it = ++points_.begin();
     it != points_.end(); it++)
{
    Vector curPos = it->getPosition();
    Vector prevPos = (--it)->getPosition();
    Vector vecFromPrev = curPos - prevPos;
    float distance = vecFromPrev.abs();
    it++;
    if (distance > MAX_DISTANCE_BETWEEN_POINTS)
    {               
        int pointsToInsert = (int)(distance / MAX_DISTANCE_BETWEEN_POINTS);             
        Vector curPos = prevPos;                
        for (int i = 0; i < pointsToInsert; i++)
        {
            curPos += vecFromPrev / pointsToInsert;
            it = points_.insert(it, PathPoint(curPos, false));
            it++;
        }
    }
}

最佳答案

考虑使用 adjacent_find 找到连续元素之间距离过大的迭代器位置,然后插入 pointsToInsert 项。

http://www.sgi.com/tech/stl/adjacent_find.html

此外,您可以使用带有仿函数的generate 来填充中间点。

http://www.sgi.com/tech/stl/generate.html

不确定你想深入 STL :)

关于c++ - 惯用STL : Iterating over a list and inserting elements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2595634/

相关文章:

c++ - Qt 与正在运行的工作线程的通信

c++ - 如何将 C++ 宏转换为更优雅的解决方案

c++ - Valgrind : is there a memory leak in the output? 总结

c++ - 常量映射元素访问

c++ - 将包含不可复制/可移动对象的结构添加到 std::map

c++ - 用于 IVR 应用的 SIP RTP 栈

c++ - 带过滤器的现代迭代 C++ 集合

C++ 从 regex_iterator 获取匹配项

java - 创建一个读取连续文件的自定义迭代器

c++ - 取消引用时调用成员函数的迭代器适配器