c++ - 将索引转换为迭代器

标签 c++ indexing iterator openframeworks

出于学习目的,我想使用迭代器重新创建以下代码。下面的代码检查 openFrameworks 中的一个框的边界,基本上它检查每当我的鼠标位置在 4 个矩形之一上时,它会将一个 bool 值变为 true,将其他的变为 false。我最近非常喜欢迭代器,但出于某种原因我无法使用迭代器进行这项工作,因为索引返回对象在 vector 中的位置,迭代器专门返回指向该位置对象的指针。这是代码:

 for ( int i = 0; i < answersBox.size(); i++){
    for ( int j = 0; j < isHovered.size(); j++){
        if( x > answersBox[i].x && x < (answersBox[i].x + answersBox[i].width) && y > answersBox[i].y && y < (answersBox[i].y + answersBox[i].height)){
         if( i == j){
                isHovered[j] = true;
                cout << "This boolean number: " << j << " has become: " << isHovered[j] << endl;
            }else if( i != j){
                isHovered[j] = false;
            }
            }{
                cout << " These booleans number: " << j << " have become: " << isHovered[j] << endl;
        }
    }
}

谢谢!

最佳答案

您不应该只是盲目地将所有 基于索引的循环转变为基于迭代器的循环。正如您所发现的,基于索引的循环有时会更好(例如:更易于阅读、编写、理解和维护)。

特别是下面这段代码:

if( i == j)

是一个很好的指标,表明基于索引的循环对于这个特定问题更好。

如果您真的想尝试使用迭代器,请查看std::distance .使用该函数,您可以将索引比较替换为:

if (std::distance(answersBox.begin(), iter1) == std::distance(isHovered.begin(), iter2)

顺便说一句,else if( i != j) 没有意义,因为条件总是为真。您可以将其替换为简单的 else

关于c++ - 将索引转换为迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25811728/

相关文章:

c++ - 会调用到 self 的隐式转换函数吗?

c++ - 重新设置一个 istringstream 对象

java - 如何在 Iterator<object> 中存储对象?

c++ - 多重映射迭代器是否也需要排序函数的类型?

c++ - 将指针包装到迭代器中以复制到 STL 容器中

c++ - C 中的 typedef、DLLEXPORT、__stdcall 帮助

c++ - 赋值运算符和复制构造函数

indexing - 在 Elasticsearch 中删除别名和索引

sql - SQLite使用自动索引代替我自己的索引

python - 按行索引 NumPy 数组