2016-07-23 51 views
0
的矢量

我正在尋找理想的方式對一個Vector(刪除,添加)工作,但也能夠使元素之間的比較C++操作元件

財產以後喜歡這樣的:

[first]...[i-1][i][i+1]...[j]...[last] <-vector 

如果條件在比較會見我&Ĵ然後執行下列操作:

[first]...[X][X][X][i*]...[j]...[last] <-vector 

,其中X是一個刪除的元素(在我們的情況下,I-1,I,I + 1)和i *是取代eleme NT。 現在我知道我和j之間的距離是2.

據我所知(新的C++),有2種方式來處理這個。要麼使用矢量的直接方法(myVec.at(i).func()>myVec.at(j).func()),但看起來你是有限的,因爲funcs像擦除&插入取決於一個迭代器。

另一種方法是使用迭代器,但比較(i & j)似乎涉及向量上的大量移動。例如,比較i和j(要求我將迭代器移動到j?,假設我不想要另一個迭代器),並刪除3個元素,需要移回到i-1來拉取元素等。

我猜你混,但它看起來可怕:

if(distance(myVec->begin(),it)+2<myVec->size() || ((Operation*) (*it))->Precedence() >= ((Operation*) myVec->at(distance(myVec->begin(),it)+2))->Precedence()); 

上面的代碼是例如一個簡單的,如果說第一次檢查是j是向量的範圍內,如果沒有比較i和j(我與迭代器,j與std :: distance)。

+0

是「J」後的下一個可能發生或有一些復發? – Surt

+0

向量迭代器構造起來非常便宜,因爲用於向量的內存保證是連續的,所以它基本上是一個指針加法。如果你想刪除元素'我',你可以'myVec.erase(myVec.begin()+ i);'。 –

回答

0

向量保證連續的內存,處理索引它們是非常便宜的。以下是完全可以接受的:以上

//assuption: i, i-1 and i+1 are all valid vector elements 
if(i + 2 < vec.size() && condition(vec[i], vec[i+2])) 
{ 
    vec.erase(vec.begin() + (i-1), vec.begin() + (i + 1)); 
} 

所有索引操作是簡單的指針運算:你不必擔心費用上的任何迭代器創建參與