【问题标题】:c++ how to remove objects from a vector in a functionc ++如何从函数中的向量中删除对象
【发布时间】:2013-12-15 12:14:32
【问题描述】:

我想从向量中删除对象。向量通过引用传递,我迷路了。我已经尝试过brickList.erase(it) 以及组合擦除删除,但我无法弄清楚正确的表达方式。

有人会在评论行中帮助我吗?在一般情况下,假设有 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;
}

【问题讨论】:

  • brickList.erase(it); 它是直接的解决方法,虽然你并不需要一个循环,因为如果你使用 2 个迭代器,你可以删除一个范围。
  • 我尝试了brickList.erase(it),但出现错误:向量迭代器不可递增。

标签: c++ object vector reference


【解决方案1】:

来自您的代码

// 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 的返回值,因为迭代器已失效。以上应该对您有用,尽管矢量不是容器的最佳选择,因为由于底层数组的重组,擦除项目可能会很慢。

【讨论】:

  • 谢谢,但是如果我有100块随机位置的砖怎么办?如果它的位置在 3 到 5 之间,我需要检查每块砖并删除它。
  • @user3019338 我明白了 - 在这种情况下,位置是一个有问题的词,因为它意味着您的意思是向量中的位置,而不是成员函数的返回值。我更新的答案对您有用吗?正如评论所暗示的,如果您需要删除大量项目,vector 可能不是最好的容器。
  • 是的!对不起,我的词汇错误,谢谢你的回答。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 2014-05-05
  • 2013-07-05
  • 2016-08-12
  • 1970-01-01
相关资源
最近更新 更多