深入理解STL:容器、迭代器与算法的核心概念及应用指南
2025-01-17 06:01:14发布 浏览147次 信息编号:105772
友情提醒:凡是以各种理由向你收取费用,均有骗子嫌疑,请提高警惕,不要轻易支付。
C++容器查找擦除操作:查找并删除指定元素
更新时间:2021年5月6日 16:20:30 作者:汉泉总部
本文主要介绍C++容器find擦除的操作:查找并删除指定元素。具有很好的参考价值,希望对大家有所帮助。下面就跟随小编一起来看看吧。
概念:容器、迭代器、算法
STL包括容器、迭代器和算法:
容器
用于管理一些相关的数据类型。每个容器都有其优点和缺点,不同的容器体现了程序设计的不同需求。容器本身可以被实现为数组或链表,或者容器中的每个元素可以具有特殊的键值。
迭代器
用于迭代数据集中的每个元素。这些数据集可以是容器或容器的子集。迭代器的主要优点是它们为任何类型的容器提供了一个小而通用的(注意通用性很重要)接口。例如,迭代器接口的一个操作是让它依次迭代数据集的每个元素。这个操作是根据容器的内部结构独立完成的。迭代器之所以起作用,是因为容器类提供了自己的迭代器类型来执行“正确的事情”,从而允许其自己的迭代器了解容器的内部结构。
迭代器的接口几乎与普通指针的接口相同。递增迭代器只需调用 ++ 运算符。使用 * 运算符获取迭代器引用的数据值。因此,迭代器可以被视为智能指针。
算法
用于处理数据集中的元素。例如,他们可以搜索、排序、修改数据或用于其他目的。算法使用迭代器,因此算法只需要编写一次,并且可以与任何容器一起使用,因为迭代器接口是所有类型容器所通用的。这就是 find() 的位置
为了赋予算法更多的可扩展性,需要提供一些算法调用的辅助函数。通用算法可用于适应非常具体和复杂的需求。您可以提供自己的搜索条件或特殊操作来绑定元素。
STL的理念就是将数据和操作分离。数据由容器类管理,而操作由可配置算法定义。迭代器是这两个元素之间的线索。它允许任何算法与容器交互。
从某种意义上说,STL的概念是基于面向对象编程的初衷:STL将数据和算法分开而不是绑定它们。然而,这样做的原因非常重要:原则上,你可以将任何容器绑定到任何算法,结果是STL具有很强的可扩展性。
STL的标准之一是它支持任意数据类型。 “标准模板库”意味着所有部件都适用于任何类型的模板。 STL 是通用编程的一个例子。容器和算法对于任何类型和类都是通用的。
STL 提供了更多通用组件。使用适配器和函数体,您可以根据特定需求补充、限制和配置算法和接口。
注意find不属于成员,而是存在于算法中,需要添加头文件#
C++删除满足条件的元素
包含头文件:
#include#include #include //注意要包含该头文件
C++ 中元素的实际删除使用容器中的 std::::erase() 方法。
在C++中,std::()不会删除元素,因为容器的size()不会改变,而只是替换元素。
1.erase()删除元素
函数原型:
iterator erase (iterator position);//删除指定元素 iterator erase (iterator first, iterator last);//删除指定范围内的元素
返回值: 指向被删除元素(或范围)的下一个元素。
(最后一个被调用的新的。如果是最后一个,这就是结束。)
对于C++中的容器,我们可以利用它来方便的遍历。但是当我们修改/map等的时候,就要小心了。
std::::erase 的描述是:
、 和 to (或第一个) 和 are ,以及 all 、 和 to (或第一个) are 保持与调用时相同。
从上面可以看出,删除元素后,原来的iter指针就会失效,后续的行为就会变得不可预知。
对于,erase会返回下一个,所以我们可以使用下面的方法:
#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 auto &element : a) { cout << element << endl; } return 0; }
实现代码
示例 1. 使用 while 循环查找并删除元素
#includeusing 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 (*itr == 3) { itr = array.erase(itr);//删除元素,返回值指向已删除元素的下一个位置 } else { ++itr; } } }
例2.使用for循环遍历并删除所有元素
#include#include using namespace std; int main() { vector test_vec; for (int i = 0; i<100;i++) { test_vec.push_back(i); } for(vector ::iterator it = test_vec.begin(); it != test_vec.end(); ) { cout<<*(it)< 示例 3. 删除重复元素
如果需要按照数据原来的顺序,可以参考本文最后的代码
如果不需要数据的原始顺序,可以使用:
sort(v.begin(),v.end()); //unique只能比较相邻元素是否重复 v.erase(unique(v.begin(), v.end()), v.end()); //unique将重复的元素移到末尾,返回末尾中第一个重复值的地址2.find()查找元素
官方文档给出的定义:
查找(STL)
查找具有指定值的元素在范围内的第一次出现。
输入迭代器用于确定要在范围内搜索的指定值的第一次出现。如果没有找到具有等效值的元素,则返回最后一个。
templateInputIterator find(InputIterator first, InputIterator last, const T& val); 第一的
输入迭代器,用于确定要在范围中搜索找到指定值的第一个元素的位置。
最后的
输入迭代器,用于确定在要搜索指定值的最后一个元素之后的范围内下一个要搜索的元素的位置。
瓦尔
要搜索的值。
find()函数:查找容器中指定的元素。该元素必须是基本数据类型。
语法:find(arr.begin(), arr.end(), 50);第一个参数是数组的起始地址,第二个参数是数组的结束地址,第三个参数是要查找的值。
如果想从指定位置开始查找,可以这样写:find(c.begin()+i+1, c.end(), c[i]);
提醒:请联系我时一定说明是从奢侈品修复培训上看到的!