我需要编写一个从向量中移除接收到的元素的函数。 我认为这样做的方法是解析向量并将迭代器与传递的引用进行比较。问题是我无法将类型迭代器与类型对象引用进行比较...
低于实际代码(编辑:我最初发布了一个简化版本)
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
答案 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
现在假设您要删除所有3
。 std::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--;
}
}