C ++将矢量迭代器与实例进行比较

时间:2013-11-25 11:40:59

标签: c++ vector

我需要编写一个从向量中移除接收到的元素的函数。 我认为这样做的方法是解析向量并将迭代器与传递的引用进行比较。问题是我无法将类型迭代器与类型对象引用进行比较...

低于实际代码(编辑:我最初发布了一个简化版本)

struct BufferPoint{int x; int y; float pressure; };

class QueueState
{
public:
        VectorCurve *curveVector;
        RasterCurve *curveRaster;
        vector<BufferPoint> *curveBuffer;
        QueueState(vector<BufferPoint> *_b, VectorCurve *_v, RasterCurve *_r){ curveBuffer= _b; curveVector = _v; curveRaster = _r;};
};


vector<vector<BufferPoint>> queueBuffers;
vector<QueueState> queueStates;


[...]


// FIND AND REMOVE A BUFFER OBJECT
for(std::vector<QueueState>::iterator it = queueStates.begin(); it != queueStates.end(); ++it) 
{   

    //Remove buffer from pool (queue)
    //////////////////////////////////////////////////////////////////////////
    if((it->curveVector->state == CURVEDATA_STATE_FINISHED) & (it->curveRaster->state == CURVEDATA_STATE_FINISHED))
    {
        queueBuffers.erase(std::find(queueBuffers.begin(), queueBuffers.end(), *(it->curveBuffer)));  // <-- THIS DOESNT WORK. CHECK BELOW FOR ERROR MESSAGE (1)
        queueStates.erase(it);
    }
    //////////////////////////////////////////////////////////////////////////
}

(1)这是我从编译器得到的消息:

Error   error C2678: binary '==' : no operator found which takes a left-hand operand of type 'const BufferPoint' (or there is no acceptable conversion) c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility 2956

3 个答案:

答案 0 :(得分:1)

如果你的真正的迭代器引用了向量中的元素,则删除很简单::

std::vector<int>::iterator myIter = ... get iterator to your element ...
buffer.erase(myIter);

如果您有一个潜在客户,并且您希望删除该值的第一个元素:

int myVal = ... whatever the value is ...
buffer.erase(std::find(buffer.begin(), buffer.end(), myVal));

最后,如果您要删除与潜在客户匹配的所有元素:

int myVal = ... whatever the value is ...
buffer.erase(std::remove(buffer.begin(), buffer.end(), myVal), buffer.end());

我有可能建议其中一项可能比你目前所做的更好。根据其他答案的输入判断,我建议您尝试 last 。如果你对它的工作方式一点也不感兴趣,那就把它想象成如下:

鉴于此顺序:

1 3 4 2 3 5 6 3 7

现在假设您要删除所有3std::remove会将您的矢量转换为以下元素 swaps

1 4 2 5 6 7 3 3 3
return it --^

然后buffer.erase()方法从返回的迭代器中删除到序列的末尾,只留下:

1 4 2 5 6 7

这通常称为remove/erase idiom


编辑:OP请求如何使用自定义结构执行此操作。

在您的情况下,只需在BufferPoint定义后定义以下内容:

struct BufferPoint {int x; int y; float pressure; };

inline bool operator ==(const BufferPoint& lhs, const BufferPoint& rhs)
{
    return lys.x == rhs.x && lhs.y == rhs.y;
}

我不确定你是否想要pressure进行相等比较。如果是这样,请将其添加为条件,但注意浮点舍入是一个令人讨厌的事情。如果你能避免它,那就去做吧。这可能是获得你所追求的最简单的方法。

答案 1 :(得分:1)

首先std::vector没有名为.remove的函数成员,它有.erase。其次,每次擦除后,所有迭代器都将失效。所以你应该更新迭代器从.erase方法返回。

  

对擦除元素以及它们与容器末尾之间的元素的迭代器和引用无效。过去的迭代器也无效。

for (vector<int>::iterator b=buff.begin(); it!=buffer.end(); )
{

   if(*b == myRef) 
       b = buffer.erase(b);
   else 
      ++b;
}

答案 2 :(得分:0)

你应该使用擦除方法,试试这个

vector<int> buffer;

int myRef ; //reference to one element of 'buffer'

for(std::vector<int>::iterator b = buffer.begin(); b != buffer.end(); ++b)
{
  if(*b == myRef)       // <-- THIS CLEARLY DOESNT WORK
  {
    b = buffer.erase(b);// <-- REMOVE THE FOUND ELEMENT FROM THE VECTOR
    b--;
  }
}