C++ 迭代器在指向整数时自动取消引用
我注意到,当在这个代码C++ 迭代器在指向整数时自动取消引用,c++,iterator,c++14,C++,Iterator,C++14,我注意到,当在这个代码目的地中执行else if语句时,尽管没有被取消引用,但它似乎被解释为它所指向的实际值,而不是迭代器。就好像它被自动取消引用一样。当begin()和end()迭代器相等时,for循环按预期执行,但我希望done设置为true目的地是一个整数的集合,此函数是全局的 void removeDestination(int destinationFloor) { bool done = false; while(!done && !destinati
目的地中执行else if
语句时,尽管没有被取消引用,但它似乎被解释为它所指向的实际值,而不是迭代器。就好像它被自动取消引用一样。当begin()
和end()
迭代器相等时,for
循环按预期执行,但我希望done
设置为true
<代码>目的地
是一个整数的集合,此函数是全局的
void removeDestination(int destinationFloor)
{
bool done = false;
while(!done && !destinations.empty())
{
for (auto destination = destinations.begin(); destination != destinations.end(); ++destination)
{
if(*destination == destinationFloor)
{
destinations.erase(destination);
break;
}
else if(destination == destinations.end())
{
done = true;
}
}
}
}
感谢您的帮助。该问题与目的地被错误地取消引用无关。如果从未执行分支,则执行else:
else if(destination == destinations.end())
因为如果目的地
到达目的地
的末尾,则循环条件:
for (auto destination = destinations.begin(); destination != destinations.end(); ++destination)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
如果可以输入,则在之前停止循环。问题与目标被错误地取消引用无关。如果从未执行分支,则执行else:
else if(destination == destinations.end())
因为如果目的地
到达目的地
的末尾,则循环条件:
for (auto destination = destinations.begin(); destination != destinations.end(); ++destination)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
如果可以输入,则在输入之前停止循环
我注意到,在这个代码目标中执行elseif语句时,尽管没有取消引用,但它似乎被解释为它所指向的实际值,而不是迭代器
没有if(*destination==destinationFloor)
将迭代器指向的值与值destinationFloor
进行比较。然而,if(destination==destinations.end())
比较两个迭代器
destinations是一个整数的deque,是该函数的全局值
void removeDestination(int destinationFloor)
{
bool done = false;
while(!done && !destinations.empty())
{
for (auto destination = destinations.begin(); destination != destinations.end(); ++destination)
{
if(*destination == destinationFloor)
{
destinations.erase(destination);
break;
}
else if(destination == destinations.end())
{
done = true;
}
}
}
}
全局变量?不使用标准算法?我鼓励你看一看。特别是,您编写的代码是一个解决得很好的问题。看
我注意到,在这个代码目标中执行elseif语句时,尽管没有取消引用,但它似乎被解释为它所指向的实际值,而不是迭代器
没有if(*destination==destinationFloor)
将迭代器指向的值与值destinationFloor
进行比较。然而,if(destination==destinations.end())
比较两个迭代器
destinations是一个整数的deque,是该函数的全局值
void removeDestination(int destinationFloor)
{
bool done = false;
while(!done && !destinations.empty())
{
for (auto destination = destinations.begin(); destination != destinations.end(); ++destination)
{
if(*destination == destinationFloor)
{
destinations.erase(destination);
break;
}
else if(destination == destinations.end())
{
done = true;
}
}
}
}
全局变量?不使用标准算法?我鼓励你看一看。特别是,您编写的代码是一个解决得很好的问题。请参阅。在迭代序列时修改序列通常是个坏主意,它会导致迭代器无效,从而导致未定义的行为
对于deque
,erase
,包括用于循环的那一个
编辑:正如评论中指出的,您已经开发了一种处理无效迭代器的策略。它的效率不是很高,但它应该能工作。您的问题在于未正确设置done
变量
这里的关键是要认识到,如果您在不中断的情况下执行了整个for
循环,那么您就完成了。所以你假设你已经完成了,除非你打破了for
循环
bool done = false;
while(!done && !destinations.empty())
{
done = true;
for (auto destination = destinations.begin(); destination != destinations.end(); ++destination)
{
if(*destination == destinationFloor)
{
destinations.erase(destination);
done = false;
break;
}
}
}
在迭代序列时修改序列通常不是一个好主意,它会导致迭代器失效,从而导致未定义的行为
对于deque
,erase
,包括用于循环的那一个
编辑:正如评论中指出的,您已经开发了一种处理无效迭代器的策略。它的效率不是很高,但它应该能工作。您的问题在于未正确设置done
变量
这里的关键是要认识到,如果您在不中断的情况下执行了整个for
循环,那么您就完成了。所以你假设你已经完成了,除非你打破了for
循环
bool done = false;
while(!done && !destinations.empty())
{
done = true;
for (auto destination = destinations.begin(); destination != destinations.end(); ++destination)
{
if(*destination == destinationFloor)
{
destinations.erase(destination);
done = false;
break;
}
}
}
程序的什么行为导致您认为迭代器在那里被取消引用?这是一个奇怪的结论。@user2357112当执行语句时,如果执行语句,它会将目标指向的元素与end()
迭代器进行比较,因此此代码创建了一个无限循环。我同意这很奇怪,但我在调试器中注意到,当我看到这个函数中的局部值发生变化时,你的程序的什么行为使你认为迭代器被取消引用了?这是一个奇怪的结论。@user2357112当执行语句时,如果执行语句,它会将目标指向的元素与end()
迭代器进行比较,因此此代码创建了一个无限循环。我同意这有点奇怪,但我在调试器中注意到,当我看到这个函数中的本地值发生变化时,我很欣赏对erase remove的引用,这个函数实际上是一个私有类成员函数。我提到的全局变量只是一个私有数据成员。我很欣赏对erase remove的引用,这个函数实际上是一个私有类成员函数。我提到的全局变量只是一个私有数据成员,我理解迭代器的失效问题。这就是我试图解决的问题,每次删除一个项目时,我都会中断迭代,然后重新启动for循环。@LBaelish很抱歉,我错过了那个小细节。我会在仔细考虑之后更新答案。我理解迭代器的失效问题。这就是我试图解决的问题,每次删除一个项目时,我都会中断迭代,然后重新启动for循环。@LBaelish很抱歉,我错过了那个小细节。我会在仔细考虑之后更新答案。