[英]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.