C++11 使用C+修改数据+;11“for”语句

C++11 使用C+修改数据+;11“for”语句,c++11,sfml,C++11,Sfml,让我解释一下,我正在使用SFML库开发一个渲染引擎 我所做的是,我用sf::RenderWindow*窗口创建了一个Game对象,其中显示了所有内容: void Game::renderize() { for (auto it : all_sprites) { window->clear(background); window->draw(it->getSprite()); } } 我知道这个新的for复制容器中每个对象的数据(

让我解释一下,我正在使用SFML库开发一个渲染引擎
我所做的是,我用
sf::RenderWindow*窗口创建了一个
Game
对象,其中显示了所有内容:

void Game::renderize() {
    for (auto it : all_sprites) {
        window->clear(background);
        window->draw(it->getSprite());
    }
}
我知道这个新的
for
复制容器中每个对象的数据(在本例中
all_sprites
std::list
),直到它结束,问题是当我试图删除一个对象时。。。实时。。。使用
擦除方法。。它出现故障,内存被转储。。。我的老师刚刚告诉我。。。“只需将精灵的坐标移动到一个你看不到的位置即可。”,因此我创建了此函数:

void Game::rmvObj(sf::String currence) {
    for (auto it : all_sprites) {
        if (it->getName() == currence) it->kill();
    }
}
问题是。。。这个方法不起作用。。。我明白为什么。。。新的
for
仅将数据复制到一个interator。。。因此,这与:

void Game::rmvObj(sf::String currence) {
    for (std::list<Object2D*>::iterator it = all_sprites.begin(); it != all_sprites.end(); ++it) {
        if ((*it)->getName() == currence) (*it)->kill();
    }
}
void游戏::rmvObj(sf::字符串当前){
for(std::list::iterator it=all_sprites.begin();it!=all_sprites.end();++it){
如果((*it)->getName()==currence)(*it)->kill();
}
}
wich指向列表中的对象,而不是副本。。。我讨厌
中的大型语句,所以…


如何使用新的C++11
for
for(auto&it:all_sprites){…}
直接更改列表中的对象请注意符号。@IgorTandetnik请您在回答中解释一下。。。auto如何与指针一起工作?这是怎么读的?新的for真的很抽象,我只知道用了ampersand,就会成为真实的别名object@EgonStetmann看看这里的文档:在你最喜欢的C++教科书中阅读。为什么你需要在你把它迭代成绘图的时候改变一个列表?我的意思是,在Update/ChangeWorld方法中迭代冲突检测列表时,您可能会遇到相同的问题,但是在Render/Draw方法中出现该问题在概念上是错误的。