C++ 比较 vector 迭代器与实例

标签 c++ vector

<分区>

我需要编写一个函数,从 vector 中删除接收到的元素。 我认为这样做的方法是解析 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

最佳答案

如果您有一个真正的迭代器引用您的 vector 中的一个元素,则移除是微不足道的::

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

相反,如果您有一个值(value) 前景并且您希望删除该值(value)的第一个 元素:

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());

我冒昧地建议其中之一可能比您目前正在做的更符合要求。从其他答案的输入来看,我建议您尝试最后一个。如果您对它的工作原理有一点好奇,请将其想象成执行以下操作:

给定这个序列:

1 3 4 2 3 5 6 3 7

现在假设您要删除所有 3std::remove 将通过元素交换

将您的 vector 转换为以下内容
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。如果是这样,将其添加为条件,但请注意浮点舍入是一件令人讨厌的事情。如果可以避免,请这样做。这可能是获得所需内容的最简单方法。

关于C++ 比较 vector 迭代器与实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20192167/

相关文章:

c++ - c++ 中的 `rand()` 可以用于生成无偏 bool 值吗?

c++ - 在静态成员分配之前调用函数

c++ - 带 POD C++ 的 std::vector::emplace_back

c++ - 二维 vector 数组的优点

c++ - 在 MEX C++ 中从 std::vector 创建 MATLAB 数组

c++ - AOSP - 错误 : undefined reference to <function-name> during build

c++ - Qt 无法手动连接到任何插槽(UI 编辑器)

c++ - 当前步骤 : Building Tasks. json 文件

r - 将矩阵与R中的向量等同是什么意思

c++ - C++ 的自定义迭代器函数