c ++操纵Elements的向量

时间:2016-07-23 20:10:02

标签: c++ vector iterator polymorphism

我正在寻找理想的方法来处理Vector(删除,添加),但也能够在元素之间进行比较

somthing喜欢这个:

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

如果在与i&amp; j的比较中满足条件,则执行以下操作:

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

其中X是删除的元素(在我们的例子中是i-1,i,i + 1),而i *是替换元素。 现在我知道i和j之间的距离是2。

据我所知(c ++新手),有两种处理方法。要么直接使用向量(myVec.at(i).func()>myVec.at(j).func()),那么它似乎是有限的,因为像erase和amp;根据迭代器插入。

另一种方式是使用迭代器,但比较(i&amp; 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,(i与迭代器,j与std :: distance)。

1 个答案:

答案 0 :(得分: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));
}

上面的所有索引操作都是简单的指针算法:你不必担心任何迭代器创建的开销