2013-11-25 65 views
0

我需要編寫一個函數,從矢量中刪除收到的元素。 我認爲這樣做的方法是解析向量並將迭代器與傳遞的引用進行比較。問題是,我不能比較類型對象引用類型的迭代器...C++比較向量迭代器與實例

低於實際CODE(編輯:最初我貼了大大簡化版本)

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 
+6

myRef是指向的矢量。不是對緩衝區元素的引用。 ' –

+0

「引用'buffer'的一個元素」意思是:'int&myRef = buffer [some_correct_index];' –

+0

你從哪裏得到myRef?你真的想做什麼?刪除具有特定值的所有項目?你如何決定要刪除什麼? – doctorlove

回答

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

我斗膽提出的其中一個將可能適合該法案遠遠比你目前正在做什麼好。通過對其他答案的輸入判斷,我建議你試試最後的之一。如果你是最小有點好奇它是如何工作的,認爲它是執行下列操作:

鑑於此序列:

1 3 4 2 3 5 6 3 7 

現在假設你要刪除所有3的。該std::remove將通過元素改變你的載體以下互換

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。如果是這樣,將其添加爲條件,但注意浮點四捨五入是一個棘手的事情來處理。如果你能避免它,那就這樣做。這可能是獲得你想要的最簡單的方法。

+0

這其實很優雅!我現在的問題是,我的實際類型不是整數,而是一個自定義類,因此我遇到了這個錯誤:'錯誤\t錯誤C2678:二進制==:找不到操作符,它需要類型const BufferPoint的左側操作數或沒有可接受的轉換)\t c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ xutility \t 2956code' –

+0

您仍然可以使用*比較器*來執行此操作。作爲「std :: remove」的第三個參數而不是一個值。它涉及更多,但仍然可行。你可以發佈'BufferPoint'的類型聲明嗎?(在你的問題中,請不要在評論中)? – WhozCraig

+0

你是什麼意思使用比較器作爲std :: remove的第三個參數? –

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--; 
    } 
} 
1

第一個std::vector沒有功能成員.remove,它有.erase。其次,每次擦除後,所有迭代器都將失效。所以你應該更新的迭代器從.erase方法返回。

Iterators and references to the erased elements and to the elements between them and the end of the container are invalidated. The past-the-end iterator is also invalidated.

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

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