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很抱歉,我错过了那个小细节。我会在仔细考虑之后更新答案。