如何在向量中找到项目的位置?

时间:2018-04-19 18:11:54

标签: c++ algorithm vector stl

我想做的就是找到向量中的项及其在向量中的位置,以便我可以在向量中执行操作(插入或删除)。我已经尝试过std :: binarysearch,但它只是通过使用条件语句来判断元素是否存在。

if(binarysearch(arr.begin(),arr.end(),98)
{
   cout<<"98 exists in the vector";
}
else 
{
   cout<<"98 does not exist in the vector";
}

是否存在其他函数会返回向量中找到的项的位置?

1 个答案:

答案 0 :(得分:2)

std :: find和std :: find_if都返回一个迭代器。您可以使用此迭代器来删除或插入,您可以从此迭代器计算项目的索引:

std::vector<char> v = {'a', 'b', 'c'};

// Search for 'b'
auto it = std::find(v.begin(), v.end(), 'b');

// To get the index of 'b'
auto index = it - v.begin();

// To insert in front of 'b' (the result is a vector of 'a', 'x', 'b', 'c')
// You cannot use the iterator after this operation!
v.insert(it, 'x');

// Search 'c' and delete it
it = std::find(v.begin(), v.end(), 'c');
v.erase(it);

迭代器只有在未修改向量时才有效。所以每个insert(),push_back(),erase()或clear()都会使所有迭代器失效。

对于std :: vector,迭代器的行为类似于普通指针。你可以移动它(++ it, - it)你可以用它做数学运算(即从另一个迭代器中减去一个迭代器得到距离oder减去begin()迭代器得到绝对索引)。

如果插入或删除矢量,则必须移动部分或全部项目。 (即如果你从''a','b','c'}中删除'b','c'必须移到前'b'的位置。这就是为什么在修改向量后,指向已删除项目之后或之后的任何项目的迭代器都会失效的原因。

如果向向量添加新元素,则保留的容量可能太小而无法保存新值。在这种情况下,分配新的存储器块,并将所有现有的项从旧的存储器块复制到新的更大的存储器块。因此,即使您只是追加新值,插入也可能使所有迭代器无效。