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++
}
}