簡體   English   中英

向量下標超出范圍,帶有嵌套的for循環

[英]Vector subscript out of range with nested for loops

下面是我用SFML用c ++編寫的游戲的代碼片段。

    if (Keyboard::isKeyPressed(Keyboard::Space)) {
        if (fireClock.getElapsedTime().asMilliseconds() > 150) {
        Bullet vecBullet(Vector2f(player->getPosition()), player->angle);
        bulletVector.push_back(vecBullet);
        sleep(milliseconds(5));
        fireClock.restart();
    }
}

if (Keyboard::isKeyPressed(Keyboard::A)) {
    Enemy vecEnemy;
    enemyVector.push_back(vecEnemy);
}

for (int i = 0; i < bulletVector.size(); i++) {
    bulletVector[i].fire();
    bulletVector[i].draw();
}
for (int i = 0; i < enemyVector.size(); i++) {
    enemyVector[i].draw();
}

for (int i = 0; i < bulletVector.size(); i++) {
    if (bulletVector[i].getPosition().x > 2000 || bulletVector[i].getPosition().x < -100 ||
        bulletVector[i].getPosition().y > 1100 || bulletVector[i].getPosition().y < -100) {
        bulletVector.erase(bulletVector.begin() + i);
    }
}

for (int y = 0; y < bulletVector.size(); y++) {
    for (int x = 0; x < enemyVector.size(); x++) {
        if (enemyVector.size() > 0 && bulletVector.size() > 0) {
            if (enemyVector[x].checkColl(Bullet(bulletVector[y]))) {
                bulletVector.erase(bulletVector.begin() + y);
                enemyVector.erase(enemyVector.begin() + x);
            }
        }
    }
}

cout << enemyVector.size() << " " << bulletVector.size() << endl;

發生的情況是,一旦子彈被發射,它就會擊中敵人,有時會墜毀並引發以下錯誤:

程序:C:\\ WINDOWS \\ SYSTEM32 \\ MSVCP140D.dll文件:c:\\ program files(x86)\\ microsoft visualstudio \\ 2017 \\ community \\ vc \\ tools \\ msvc \\ 14.13.26128 \\ include \\ vector行:1806

表達式:向量下標超出范圍

謝謝您能給我的任何見解。

正如@Igor Tandetnik指出的那樣,您可以在使用bulletVector.erase(bulletVector.begin() + y); 進行迭代從數組中刪除一個元素 bulletVector.erase(bulletVector.begin() + y);

關於這個 主題 ,有很多關於SO的例子 ,我可能不會對其做更好的解釋。


我想在您的代碼中指出一些額外的內容。 在這個部分:

for (int y = 0; y < bulletVector.size(); y++) {
    for (int x = 0; x < enemyVector.size(); x++) {
        if (enemyVector.size() > 0 && bulletVector.size() > 0) {
            if (enemyVector[x].checkColl(Bullet(bulletVector[y]))) {
                bulletVector.erase(bulletVector.begin() + y);
                enemyVector.erase(enemyVector.begin() + x);
            }
        }
    }
}

在尋找沖突的地方,這句話很多余:

if (enemyVector.size() > 0 && bulletVector.size() > 0) {

如果兩個向量中的任何一個都為空,則for循環中的至少一個不會迭代單個循環,因此您可以刪除該檢查並保存一些計算和代碼行。

此時,請確保兩個向量內部至少包含1個元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM