How to Store Duplicate Elements in Ordered Set in C++?
Last Updated :
19 May, 2022
Ordered Set contains UNIQUE elements in sorted order just like set. While dealing with an ordered set with duplicate elements, the pair<int, int> data type is used instead of int where the first value of the pair will store the element and the second value will store the corresponding indexes. By doing this each pair in the ordered set will be unique and one can easily store the duplicate elements of the array.
Operations:
1. order_of_key(): It accepts an element as a parameter and returns the number of elements strictly less than the key. While implementing it, we need to pass a pair as the parameter whose first value needs to be the number which we want the result for and the second value will contain a negative value e.g., -1 because the inserted pairs in the ordered_set will have the value greater than equal to 0 as it denotes the indexes of the array.
2. find_by_order(): It accepts an index as a parameter and returns an iterator to the ith element (pair) in sorted order.
Example:
Let assume there is a ordered set pair mySet = {4, 7, 2, 4, 5, 8, 4, 1, 3, 5}
Here,
- The ordered set pair has duplicate elements.
- After inserting all elements in ordered_set_pair,
- mySet.order_of_key({5, -1}): It will give the number of elements less than 5 i.e, 6.
- mySet.find_by_order(8): It will give an iterator to 8th element in the ordered set i.e, 7.
Below is the C++ program to implement the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
typedef tree<pair< int , int >, null_type,
less<pair< int , int >>, rb_tree_tag,
tree_order_statistics_node_update>
ordered_set_pair;
int main()
{
int arr[10] = {4, 7, 2, 4, 5,
8, 4, 1, 3, 5};
ordered_set_pair mySet;
for ( int i = 0; i < 10; i++)
{
mySet.insert({arr[i], i});
}
cout << "Count of elements less than 5: " <<
mySet.order_of_key({5, -1}) << endl;
auto itr = mySet.find_by_order(8);
cout << "The 8th element in the ordered set is: " <<
(*itr).first << endl;
return 0;
}
|
Output
Count of elements less than 5: 6
The 8th element in the ordered set is: 7
For range queries like the number of elements lying between L and R inclusive i.e., [L, R], one can find it using:
mySet.order_of_key({R+1,-1}) – myset.order_of_key({L,-1})
Time complexity for both the operations i.e., find_by_order() and order_of_key() is O(log(n)).
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...