簡體   English   中英

c ++如何從函數中的向量中刪除對象

[英]c++ how to remove objects from a vector in a function

我想從矢量中刪除對象。 矢量通過引用傳遞,我迷路了。 我已經嘗試過brickList.erase(它)以及組合擦除刪除,但我無法弄清楚正確的表達式。

有人會這么善意幫我評論一下嗎? 在一般情況下,讓我們說100塊磚隨機位置。

#include "stdafx.h"

#include <iostream>
#include <vector>

class Brick {
private:
    int position;
public:
    Brick(int);
    int getPosition();
};
Brick::Brick(int p) : position(p) {};
int Brick::getPosition() { return position; }

void removeBricks(int a, int b, std::vector<Brick> &brickList) {
    std::vector<Brick>::iterator it;
    for (it = brickList.begin(); it != brickList.end(); ++it) {
        int currentPos = (*it).getPosition();
        if (currentPos >= a && currentPos <= b) {
            // here I need help to delete objects
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<Brick> myBricks;
    for (int i = 0; i<10; ++i) {
        Brick tmp_brick(i);
        myBricks.push_back(tmp_brick);
    }
    // delete all bricks with position between 3 and 5
    removeBricks(3, 5, myBricks);
    system("pause");
    return 0;
}

從你的代碼

// delete all bricks with position between 3 and 5
//removeBricks(3, 5, myBricks);  // <-- replace this
myBricks.erase(myBricks.begin()+3,myBricks.begin()+5); // <--  with this

使用基於范圍的erase功能。 你根本不需要你的removeBricks函數。

如果你必須使用removeBricks()函數,你可以使用相同的函數原型這樣做。

void removeBricks(int a, int b, std::vector<Brick> &brickList) {
    // check a >= 0, a < b and b doesn't exceed length of brickList
    brickList.erase(brickList.begin()+a,brickList.begin()+b);
}

編輯:似乎您的位置概念不是指您的項目的數組位置,而是Brick的成員函數的值。 這應該適合你。

void removeBricks(int a, int b, std::vector<Brick> &brickList) 
{
    std::vector<Brick>::iterator it;
    for (it = brickList.begin(); it != brickList.end(); /* DONT increment here*/) {
        int currentPos = (*it).getPosition();
        if (currentPos >= a && currentPos <= b) {
            // store the return value from erase!!
            it = erase(it);
        }
        else
        {
            // increment here rather than in the for loop incrementer
            it++;
        }
    }
}

您必須存儲erase的返回值,因為迭代器無效。 雖然vector不是容器的最佳選擇,但上面應該對你有用,因為由於底層數組的重組,擦除項可能很慢。

暫無
暫無

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

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