c++ - 如何使用 C++ 中的迭代器编写一个循环,将 unordered_set 的每个元素与所有其他元素进行比较?

标签 c++ loops iterator unordered-map unordered-set

我有一个 unordered_set,我需要挑选每个元素并将其与所有其他元素进行比较。

注意事项:

  1. 如果比较 A 和 B,我就不需要比较 B 和 A。
  2. 我的 unordered_set 是一个 unordered_map 的值,它的键是一对。

我尝试了以下方法:

unordered_map <pair<int, int>, unordered_set <int>, boost::hash<std::pair<int,int>>> gridMap;
unordered_map <int, rigidBody*> objectsMap;


    auto gridMapIt = gridMap.begin();
    while (gridMapIt != gridMap.end()) // loop the whole gridMap
    {
        auto setItOut = gridMapIt->second.begin();
        while (setItOut != gridMapIt->second.end()) // loop each element of the set
        {
            auto setItIn = gridMapIt->second.begin();
            while (setItIn != gridMapIt->second.end()) // versus each other element
            {
                //compare and do stuff

                ++setItIn;
            }

            checked.insert({ objectsMap[*setItOut]->getID(), objectsMap[*setItIn]->getID() });
            checked.insert({ objectsMap[*setItIn]->getID(), objectsMap[*setItOut]->getID() });

            ++setItOut;
        }

        ++gridMapIt;
    }

我收到的错误是“表达式:无法取消引用结束列表迭代器”。如果我删除或评论最里面的 while 循环,它工作正常。

提前致谢。

最佳答案

在循环后使用*setItIn无效。那时你有一个指向过去最后一个元素的迭代器。这就是错误告诉您的内容。

如果您从 while 更改为 for,您可以使用范围规则来阻止您自己取消引用无效的迭代器。

您可以从下一个元素而不是第一个元素开始内部循环,而不是填充 checked

for (auto & gridElem : gridMap) {
    for (auto setItOut = gridElem.second.begin(), setEnd = gridElem.second.end(); setItOut != setEnd; ++setItOut) {
        for (auto setItIn = std::next(setItOut); setItIn != setEnd; ++setItIn) {
            //compare and do stuff
        }
        // setItIn not visible here
    }
}

关于c++ - 如何使用 C++ 中的迭代器编写一个循环,将 unordered_set 的每个元素与所有其他元素进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59058410/

相关文章:

c++ - 不使用兼容工具集时删除预制配置

Python - 并行化 2D 掩码数组的 python 循环?

c++ - 重载 std::distance 等 std 函数是否合理?

javascript - 这个 for-in 循环检测片段会产生不需要的误报吗?

c++ - 迭代器需求满足

PHP - RecursiveArrayIterator 在除最后一级之外的所有级别上递归

c# - 覆盖基类方法

c++ - 如何有条件地编译可变参数模板?

c++ - 命名空间(静态)成员变量

windows - FOR 循环内的 WHILE 循环批量