C++ 帮助使用C++;列表擦除功能

C++ 帮助使用C++;列表擦除功能,c++,iterator,C++,Iterator,我正在尝试做一个简单的擦除并不断地出错 以下是我的擦除的代码片段: std::list<Mine*>::iterator iterMines = mines.begin(); for(int i = oldSizeOfMines; i >0 ; i--, iterMines++) { if(player->distanceFrom(*iterMines) < radiusOfOnScreen) { onScreen.push_back

我正在尝试做一个简单的擦除并不断地出错

以下是我的擦除的代码片段:

std::list<Mine*>::iterator iterMines = mines.begin();
for(int i = oldSizeOfMines; i >0 ; i--, iterMines++)
{
    if(player->distanceFrom(*iterMines) < radiusOfOnScreen)
    {
        onScreen.push_back(*iterMines);
        iterMines = onScreen.erase(iterMines);
        iterMines--;
    }
}
std::list::iterator iterMines=mines.begin();
对于(int i=oldSizeOfMines;i>0;i--,iterMines++)
{
如果(玩家->距离(*iterMines)
我一直收到一条编译器消息:

1>c:\users\owner\desktop\bosconian\code\bosconian\environment.cpp(158) : error C2664: 'std::list<_Ty>::_Iterator<_Secure_validation> std::list<_Ty>::erase(std::list<_Ty>::_Iterator<_Secure_validation>)' : cannot convert parameter 1 from 'std::list<_Ty>::_Iterator<_Secure_validation>' to 'std::list<_Ty>::_Iterator<_Secure_validation>'
1>        with
1>        [
1>            _Ty=SpaceObject *,
1>            _Secure_validation=true
1>        ]
1>        and
1>        [
1>            _Ty=Mine *,
1>            _Secure_validation=true
1>        ]
1>        and
1>        [
1>            _Ty=SpaceObject *,
1>            _Secure_validation=true
1>        ]
1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>c:\users\owner\desktop\bosconian\code\bosconian\environment.cpp(158):错误C2664:'std::list::'u Iterator std::list::erase(std::list::'u Iterator)':无法将参数1从'std::list:'u Iterator'转换为'std::list:'
1> 与
1>        [
1> _Ty=空间对象*,
1> \u安全\u验证=真
1>        ]
1> 及
1>        [
1> _Ty=我的*,
1> \u安全\u验证=真
1>        ]
1> 及
1>        [
1> _Ty=空间对象*,
1> \u安全\u验证=真
1>        ]
1> 没有可执行此转换的用户定义的转换运算符,或者无法调用该运算符
我很困惑,因为我相信我给出了正确的迭代器

Mine是SpaceObject的一个子类(即第二代子类)


这跟这事有关系吗?我该如何修复它呢?

问题是您试图在屏幕列表中使用我的迭代器作为迭代器。这是行不通的


您是否打算调用mines.erase(iterMines)而不是屏幕上的.erase(iterMines)?

问题是您试图将mines的迭代器用作屏幕列表中的迭代器。这是行不通的

你的意思是叫mines.erase(iterMines)而不是在屏幕上。erase(iterMines)吗

最好使用pre-increment,因为您永远不知道迭代器在创建自身副本时在幕后做了什么
++it
将返回新的迭代器,而
it++
将在增量之前返回迭代器的副本。我已经评论了可能的解决方案过于复杂的部分:)

最好使用pre-increment,因为您永远不知道迭代器在创建自身副本时在幕后做了什么
++it
将返回新的迭代器,而
it++
将在增量之前返回迭代器的副本。我已经评论了可能的解决方案过于简单的部分:)

更简单的方法 更简单的方法

为了确保,第158行是“iterMines=屏幕上。擦除(iterMines);”?为了确保,第158行是“iterMines=屏幕上。擦除(iterMines);”?擦除在集合中不统一是我对stl容器的主要抱怨之一。这就是为什么我更喜欢使用erase(iter++)惯用grepsedawk,这对vector和deque非常危险,当您从容器的中间删除一个元素时,它通常会使所有迭代器无效(对于vector,只对下面的元素,但这就是您在那里使用的)。因此,最好使用erase的返回值。同意,但对于[multi]map/set,它是唯一的选择。您还可以使用反向迭代器技术来实现安全的结果,向量化在集合中不统一是我对stl容器的主要抱怨之一。这就是为什么我更喜欢使用erase(iter++)惯用grepsedawk,这对vector和deque非常危险,当您从容器的中间删除一个元素时,它通常会使所有迭代器无效(对于vector,只对下面的元素,但这就是您在那里使用的)。因此,最好使用erase的返回值。同意,但对于[multi]map/set,它是唯一的选择。您还可以使用反向迭代器技术实现向量的安全结果
std::list<Mine*>::iterator iterMines = mines.begin();
for(int i = oldSizeOfMines; i >0 ; i--, iterMines++)
{
        if(player->distanceFrom(*iterMines) < radiusOfOnScreen)
        {
                onScreen.push_back(*iterMines);
                iterMines = onScreen.erase(iterMines);
                iterMines--;
        }
}
std::list<Mine*>::iterator iterMines = mines.begin();
for(int i = oldSizeOfMines; i >0 ; i--)
{
        if(player->distanceFrom(*iterMines) < radiusOfOnScreen)
        {
                onScreen.push_back(*iterMines);
                iterMines = mines.erase(iterMines); // change to mines!!
        } else { 
            ++iterMines; // better to use ++it instead of it++
        }
}