Deque or Double-ended queues are sequence containers with the feature of expansion and contraction on both ends. They are similar to vectors, but are more efficient in the case of insertion and deletion of elements at the end, and also at the beginning. Unlike vectors, contiguous storage allocation may not be guaranteed.
deque::clear()
The clear() function is used to remove all the elements of the deque container, thus making its size 0.
Syntax :
dequename.clear()
Parameters :
No parameters are passed.
Result :
All the elements of the deque are
removed ( or destroyed )
Examples:
Input : mydeque = {1, 2, 3, 4, 5}
mydeque.clear();
Output : mydeque = {}
Input : mydeque = {}
mydeque.clear();
Output : mydeque = {}
Errors and Exceptions:
1. It has a no exception throw guarantee.
2. Shows error when a parameter is passed.
CPP
#include <deque>
#include <iostream>
using namespace std;
int main()
{
deque< int > mydeque{ 1, 2, 3, 4, 5 };
mydeque.clear();
for ( auto it = mydeque.begin(); it != mydeque.end(); ++it)
cout << ' ' << *it;
return 0;
}
|
deque::erase()
The erase() function is used to remove elements from a container from the specified position or range.
Syntax :
1. dequename.erase(position)
2. dequename.erase(startingposition, endingposition)
Parameters :
Position of the element to be removed in the form of iterator.
or the range specified using start and end iterator i.e., [start iterator, end iterator).
Result :
Elements are removed from the specified
position of the container.
Examples:
Input: mydeque{1, 2, 3, 4, 5}, iterator= 2
mydeque.erase(iterator);
Output: 1, 2, 4, 5
Input : mydeque{1, 2, 3, 4, 5, 6, 7, 8}, iterator1= 3, iterator2= 6
mydeque.erase(iterator1, iterator2);
Output: 1, 2, 3, 7, 8
Errors and Exceptions:
1. It has a no exception throw guarantee if the position is valid.
2. Shows undefined behavior otherwise.
Removing elements from a particular position
CPP
#include <deque>
#include <iostream>
using namespace std;
int main()
{
deque< int > mydeque{ 1, 2, 3, 4, 5 };
deque< int >::iterator it;
it = mydeque.begin();
mydeque.erase(it);
for ( auto it = mydeque.begin(); it != mydeque.end(); ++it)
cout << ' ' << *it;
return 0;
}
|
Removing elements within a range
CPP
#include <deque>
#include <iostream>
using namespace std;
int main()
{
deque< int > mydeque{ 1, 2, 3, 4, 5 };
deque< int >::iterator it1, it2;
it1 = mydeque.begin();
it2 = mydeque.end();
it2--;
it2--;
mydeque.erase(it1, it2);
for ( auto it = mydeque.begin(); it != mydeque.end(); ++it)
cout << ' ' << *it;
return 0;
}
|
Application:
Given a list of integers, remove all the even elements from the deque and print the deque.
Input : 1, 2, 3, 4, 5, 6, 7, 8, 9
Output:1 3 5 7 9
Explanation: 2, 4, 6 and 8 which are even are erased from the deque
Algorithm:
1. Run a loop till the size of the deque.
2. Check if the element at each position is divisible by 2, if yes, remove the element and increment the iterator, else just increment the iterator to check the next element.
3. Print the final deque.
CPP
#include <deque>
#include <iostream>
using namespace std;
int main()
{
deque< int > mydeque{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
deque< int >::iterator i;
i = mydeque.begin();
while (i != mydeque.end()) {
if (*i % 2 == 0)
mydeque.erase(i);
i++;
}
for ( auto it = mydeque.begin(); it != mydeque.end(); ++it)
cout << ' ' << *it;
return 0;
}
|
clear() VS erase() . When to use what?
clear() removes all the elements from a deque container, thus making its size 0. All the elements of the deque are removed using clear() function.
erase() function on the other hand, is used to remove specific elements from the container or a range of elements from the container, thus reducing its size by the number of elements removed.
Let us see the differences in a tabular form -:
| deque::clear() | deque::erase() |
1. | It is used to remove all elements from the deque | It is used to remove from the deque container either a single element or a range of elements |
2. | Its syntax is -: clear() | Its syntax is -: iterator erase (const_iterator position ); |
3. | It does not take any parameters. | Its complexity is linear. |
4. | It does not have any return value. | It takes two parameters that are -: 1. Iterator pointing to a single element to be removed from the deque. 2. Iterators specifying a range within the deque to be removed |
5. | Its complexity is linear. | It is define in <deque> header file. |