《C++ vector容器 find erase的使用:查找并删除指定元素.docx》由会员分享,可在线阅读,更多相关《C++ vector容器 find erase的使用:查找并删除指定元素.docx(8页珍藏版)》请在金锄头文库上搜索。
1、C+ vector容器 find erase的使用:查找并删除指定元素概念:容器、迭代器、算法STL包括容器、迭代器和算法:容器用于管理一些相关的数据类型。每种容器都有它的优缺点,不同的容器反映出程序设计的不同需求。容器自身可能由数组或链表实现,或者容器中的每个元素都有特殊的关键值。迭代器用于遍历一个数据集中的每个元素。这些数据集可能是容器或者容器的子集。迭代器的主要优点是它们为任意类型的容器提供一个小巧并且通用(注意通用很重要)的接口。例如,迭代器接口的一个操作是让它依次遍历数据集的每个元素。这个操作是依赖容器的内总部结构独立完成的。迭代器之所以有效是因为容器类提供它自己的迭代器类型来做“正
2、确的事”,容本身的迭代器了解容器的内部结构。迭代器的接口几乎相当于普通的指针。让一个迭代器递增只需调用+操作符。使用*操作符可以得到迭代器引用的数据值。因而迭代器可以被任为是一种智能指针。算法被用于处理数据集中的元素。例如它们可以搜索、排序、修改数据或者其他目的。算法使用迭代器,因此,一个算法只需被编写一次就可以用于任意的容器,因为迭代器的接口对所有类型的容器是通用的。这就是find()的位置为了给算法更多的扩展性,需要提供一些被算法调用的附属函数。可以使用通用算法去适应非常特别和复杂的需求。你可以提供自己的搜索标准或者特殊的操作去绑定元素。STL的概念是将数据和操作独立开来。数据由容器类管理
3、,而操作是由可配置的算法定义。迭代器则是这两个元素之间的线索。它允许任何算法和容器的交互。在某种意义上,STL的概念有勃于面向对象编程的初衷:STL将数据和算法分离而非绑定它们。然而,这样做的理由非常重要:原则上,你可以将任何容器同任何算法绑定,得到的结果是STL是非常可扩展的。STL的一个标准是它支持任意数据类型。“标准模板库”意味着,所有部分是适应任意类型的模板。STL是通用编程的例子。容器和算法对任意类型和类都是通用的。STL甚至提供更多的通用组件。使用 适配器 和函数体,你可以为特定需要补充、限制和配置算法和接口。注意find不属于vector的成员,而存在于算法中,应加上头文件#in
4、clude C+ vector 删除符合条件的元素包含头文件:#include #include #include /注意要包含该头文件C+ vector中实际删除元素使用的是容器vector中std:vector:erase()方法。C+ 中std:remove()并不删除元素,因为容器的size()没有变化,只是元素的替换。1.erase( ) 删除元素函数原型:iterator erase (iterator position);/删除指定元素iterator erase (iterator first, iterator last);/删除指定范围内的元素返回值:指向删除元素(或范围)
5、的下一个元素。(An iterator pointing to the new location of the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence.)对于c+里面的容器, 我们可以使用iterator进行方便的遍历. 但是当我们通过iterator对vector/map等进行修改时, 我们就要小心了。cplusplus的refere
6、nce里对 std:vector:erase 的描述是:Iterators, pointers and references pointing to position (or first) and beyond are invalidated, with all iterators, pointers and references to elements before position (or first) are guaranteed to keep referring to the same elements they were referring to before the call.由
7、上可知,原有iter指针在删除元素后会失效,之后的行为都变得不可预知.。对于vector, erase会返回下一个iterator, 因此我们可以使用如下的方法:#include #include using namespace std;int main() vector a = 12, 23, 34, 45, 56, 67, 78, 89 ; auto iter = a.begin(); while (iter != a.end() if (*iter 30) iter = a.erase(iter);/用iter接收返回值 else /不要忘记这一段 +iter; for (const a
8、uto &element : a) cout element endl; return 0;实现代码例1. 用while循环查找并删除一个元素#include using namespace std;void main(void) vector array; array.push_back(1); array.push_back(2); array.push_back(3); array.push_back(4); array.push_back(5); vector:iterator itr = array.begin(); while (itr != array.end() if (*it
9、r = 3) itr = array.erase(itr);/删除元素,返回值指向已删除元素的下一个位置 else +itr; 例2. 用for循环遍历删除所有元素#include #include using namespace std;int main() vector test_vec; for (int i = 0; i100;i+) test_vec.push_back(i); for(vector:iterator it = test_vec.begin(); it != test_vec.end(); ) cout*(it)endl; it = test_vec.erase(it
10、); return 0; 例3. 删除重复元素若要求按照数据原来的顺序,参照本文最后的代码若不要求按照数据原来的顺序,可用:sort(v.begin(),v.end(); /unique只能比较相邻元素是否重复v.erase(unique(v.begin(), v.end(), v.end(); /unique将重复的元素移到末尾,返回末尾中第一个重复值的地址2.find( ) 查找元素官方文档给出的定义:find (STL)在范围中找到具有指定值的元素的第一个匹配项位置。用于确定要在范围中搜索的指定值第一次出现的位置的输入迭代器。 如果找不到具有等效值的元素,则返回 last。templat
11、e InputIterator find(InputIterator first, InputIterator last, const T& val);first用于确定要在范围中搜索其指定值的第一个元素的位置的输入迭代器。last用于确定要在范围中搜索其指定值的最后一个元素之后下一个元素的位置的输入迭代器。val要搜索的值。find() 函数:在容器内查找指定的元素,这个元素必须是基本数据类型的。语法:find(arr.begin(), arr.end(), 50);第一个参数是array的起始地址,第二个参数是array的结束地址,第三个参数是需要查找的值。如果想从指定位置开始查找,可以这
12、样写:find(c.begin()+i+1, c.end(), ci);其中i为自定义的位移量,结合for循环可以实现从当前位置开始查找查找成功:返回一个指向指定元素的迭代器查找失败:返回end迭代器STL库中,find( )源码如下:template InputIterator find(InputIterator first, InputIterator last, const T& value) while (first != last & *first != value) +first; +first; return first;用find查找并删除一个元素#include#inclu
13、de#includeusing namespace std;vector arr(100);/整型的array数组int main() arr20 = 50;/其余都是默认值0 vector:iterator s = find(arr.begin(), arr.end(), 50);/第一个参数是array的起始地址,第二个参数是array的结束地址,第三个参数是需要查找的值 if (s != arr.end()/如果找到,就输出这个元素 cout *s endl; else/如果没找到 cout not find! endl; system(pause); return 0;另外还有一个函数: find_if函数find_if函数,带条件的查找元素。容器