如何使用 C++ 中的迭代器编写一个循环,将 unordered_set 的每个元素与所有其他元素进行比较?
How can I code a loop that compares every element of an unordered_set with all the others, using iterators in C++?
我有一个 unordered_set,我需要选择每个元素并将其与所有其他元素进行比较。
备注:
- 如果比较A和B,我就不需要比较B和A了
- 我的 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;
}
我收到的错误是 "Expression: cannot dereference end list iterator"。如果我删除或评论最里面的 while 循环,它工作正常。
提前致谢。
循环后使用*setItIn
无效。那时你有一个迭代器指向 past 最后一个元素。这就是错误告诉您的内容。
如果您从 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
}
}
我有一个 unordered_set,我需要选择每个元素并将其与所有其他元素进行比较。
备注:
- 如果比较A和B,我就不需要比较B和A了
- 我的 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;
}
我收到的错误是 "Expression: cannot dereference end list iterator"。如果我删除或评论最里面的 while 循环,它工作正常。
提前致谢。
循环后使用*setItIn
无效。那时你有一个迭代器指向 past 最后一个元素。这就是错误告诉您的内容。
如果您从 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
}
}