C++ STL中的deque :: clear()和deque :: erase()
双端队列或Deque是具有在两端扩展和收缩功能的序列容器。它们类似于向量,但在元素在结尾和开头插入和删除的情况下更有效。与向量不同,可能无法保证连续存储分配。
deque :: clear()
clear () 函数用于删除deque容器的所有元素,从而使其大小为0。
语法:
dequename.clear()
参数:不传递参数。
结果:删除(或销毁)deque的所有元素
示例:
输入: mydeque = {1, 2, 3, 4, 5}
mydeque.clear();
输出 : mydeque = {}
输入: mydeque = {}
mydeque.clear();
输出: mydeque = {}
错误和异常:
1. 如果未传递参数,则没有异常抛出保证。
2. 如果传递参数,则会显示错误。
// CPP程序说明
// clear ()函数的实现
#include
#include
using namespace std;
int main()
{
deque mydeque{ 1, 2, 3, 4, 5 };
mydeque.clear();
// deque变为空
// 打印deque
for (auto it = mydeque.begin(); it != mydeque.end(); ++it)
cout << ' ' << *it;
return 0;
}
deque :: erase()
erase() 函数用于从指定位置或范围中的容器中删除元素。
语法:
- dequename.erase(position)
-
dequename.erase(startingposition, endingposition)
参数:
元素的位置,以迭代器的形式给出。或使用起始位置和结束位置的范围,即[start iterator,end iterator)
。
结果:
从容器的指定位置删除元素。
示例:
输入: mydeque {1, 2, 3, 4, 5},迭代器= 2
mydeque.erase(iterator);
输出: 1、2、4、5
输入: mydeque{1, 2, 3, 4, 5, 6, 7, 8},迭代器1= 3,迭代器2= 6
mydeque.erase(iterator1, iterator2);
输出: 1、2、3、7、8
错误和异常:
1. 如果位置有效,则不会抛出任何异常保证。
2. 否则会显示未定义的行为。
从特定位置删除元素
// CPP程序说明
// erase()函数的实现
# include
# include
using namespace std;
int main()
{
deque mydeque{ 1, 2, 3, 4, 5 };
deque::iterator it;
it = mydeque.begin();
mydeque.erase(it);
// 打印deque
for (auto it = mydeque.begin(); it != mydeque.end(); ++it)
cout << ' ' << *it;
return 0;
}
输出
2 3 4 5
在范围内删除元素
// CPP程序演示
// 实现erase()函数
# include
# include
using namespace std;
int main()
{
deque mydeque{1, 2, 3, 4, 5};
deque::iterator it1, it2;
it1 = mydeque.begin();
it2 = mydeque.end();
it2--;
it2--;
mydeque.erase(it1, it2);
// 打印deque
for (auto it = mydeque.begin(); it != mydeque.end(); ++it)
cout << ' ' << *it;
return 0;
}
输出
4 5
应用:
给定一个整数列表,从deque中删除所有偶数元素并打印deque。
输入: 1、2、3、4、5、6、7、8、9
输出: 1 3 5 7 9
说明: 2、4、6和8是偶数,从deque中删除掉
算法:
1. 循环直到deque的大小为止。
2. 检查每个位置的元素是否可以被2整除,如果可以,则删除该元素并递增迭代器,否则仅递增迭代器以检查下一个元素。
3. 打印最终的deque。
// CPP程序演示
// erase()函数的应用
# include
# include
using namespace std;
int main()
{
deque mydeque{1, 2, 3, 4, 5, 6, 7, 8, 9};
deque::iterator i;
i = mydeque.begin();
while (i != mydeque.end())
{
if (*i % 2 == 0) /*如果在循环内部删除,不是一个好主意,如果您删除最后一个元素,mydeque.end()将找不到,导致无限循环*/
mydeque.erase(i);
i++;
}
//打印deque
for (auto it = mydeque.begin(); it != mydeque.end(); ++it)
cout << ' ' << *it;
return 0;
}
输出
1 3 5 7 9
clear() VS erase()。什么时候使用什么?
clear() 从deque容器中移除所有元素,使其大小为0。使用clear()函数删除deque的所有元素。
erase() 函数用于从容器中删除特定元素或一系列元素,从而将其大小减少所删除的元素数。
让我们以表格形式看到区别:
ID | deque::clear() | deque::erase() |
---|---|---|
1. | 它用于从deque中删除所有元素 | 它用于从deque容器中删除单个元素或一系列元素 |
2. | 它的语法是: clear() | 它的语法是: 迭代器erase(const_iterator position); |
3. | 它不接受任何参数。 | 它的复杂度是线性的。 |
4. | 它没有返回值。 | 它有两个参数: 1.指向要从deque中删除的单个元素的迭代器。 2.指定要删除的deque中的范围的迭代器 |
5. | 它的复杂度是线性的。 | 在头文件中定义。 |