STL Algorithm ( std :: unique)
This article is all about std :: unique algorithm. This std :: unique is an Algorithm that removes all consecutive duplicate elements from a given range. For example, we have an array of elements i.e. ,
1,2,3,3,3,4,4,5,5
and we want to delete the conjugative elements i.e. 3 , 4 and 5 . this can be done by following method.
Let’s see the below examples to understand the concept well.
- Removing element by conjunctive position
- Removing duplicate objects based on their name
- Removing duplicate objects by lambda function
- Removing duplicate objects based on there ID
Example 1: Removing element by conjunctive position –
std::unique removes consecutive duplicate elements. For executing this we should sort the given range, and make sure that duplicate elements are at their consecutive positions.
#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
std::vector<int> vec1 = {1,6,3,5,4,8,5,2,3,9,8,6,7,1,5,9,0};
// Sorting of element to bring conjugative position
std::sort(vec1.begin(), vec1.end());
std::vector<int>::iterator vec2;
// Overriding the duplicate element
vec2 = std::unique(vec1.begin(), vec1.end());
vec1.erase(vec2, vec1.end());
std ::cout<< " after deletion : ";
for(int i=0; i < vec1.size(); i++)
std::cout << vec1.at(i) << ' ';
return 0;
}
Output : after deletion : 0 1 2 3 4 5 6 7 8 9
Example 2 : Removing duplicate objects based on their name –
Let we have a class People with name and id as member variables and we want to remove duplicate elements from a vector of class people objects based on name .
#include <iostream>
#include <algorithm>
#include <vector>
class People
{
public:
std::string MN;
int ID;
People(std::string name, int id) :
MN(name), ID(id) {
}
bool operator <(const People & obj)
{
if (ID < obj.ID)
return true;
else
return false;
}
bool operator ==(const People & obj)
{
if (ID == obj.ID)
return true;
else
return false;
}
};
struct peopleequalcomp
{
bool operator()(const People & fst, const People & snd)
{
if (fst.MN == snd.MN)
return true;
else
return false;
}
};
struct peoplecomp
{
bool operator()(const People & fst, const People & snd)
{
if (fst.MN < snd.MN)
return true;
else
return false;
}
};
int main()
{
std::vector<People> vp = { People("AAA", 1), People("BBB", 2),
People("BBB", 3),People("AAA", 4) };
std::sort(vp.begin(), vp.end(), peoplecomp());
std::vector<People>::iterator NP;
NP = std::unique(vp.begin(),vp.end(), peopleequalcomp());
vp.erase( NP, vp.end());
std::cout << "Removing duplicate based on Name ....\n";
std::for_each(vp.begin(), vp.end(), [](People & obj) {
std::cout<<obj.ID<< " : "<<obj.MN<<std::endl;
});
}
Output : Removing duplicate based on Name .... 1 : AAA 2 : BBB
Example 3 : Removing duplicate objects by lambda function –
Let we have a class People with name and id as member variables and we want to remove duplicate elements from a vector of class people objects based on name with lambda function .
#include <iostream>
#include <algorithm>
#include <vector>
class People
{
public:
std::string MN;
int ID;
People(std::string name, int id) :
MN(name), ID(id) {
}
bool operator <(const People & obj)
{
if (ID < obj.ID)
return true;
else
return false;
}
bool operator ==(const People & obj)
{
if (ID == obj.ID)
return true;
else
return false;
}
};
struct peopleequalcomp
{
bool operator()(const People & fst, const People & snd)
{
if (fst.MN == snd.MN)
return true;
else
return false;
}
};
struct peoplecomp
{
bool operator()(const People & fst, const People & snd)
{
if (fst.MN < snd.MN)
return true;
else
return false;
}
};
int main()
{
std::vector<People> vp = { People("AAA", 1), People("BBB", 2),
People("BBB", 3),People("AAA", 1) ,People("DDD", 5),People("EEE", 2),People("CCC", 3) };
std::sort(vp.begin(), vp.end(), [](const People & fst, const People & sec) {
if (fst.MN < sec.MN)
return true;
else
return false;
});
std::vector<People>::iterator NP;
NP = std::unique(vp.begin(), vp.end(), [](const People & fst, const People & sec) {
if (fst.MN == sec.MN)
return true;
else
return false;
});
vp.erase( NP, vp.end());
std::cout << "Removing duplicate Persons based on Name ......\n";
std::for_each(vp.begin(), vp.end(), [](People & obj) {
std::cout<<obj.ID<< " :: "<<obj.MN<<std::endl;
});
}
Output : Removing duplicate Persons based on Name ...... 1 :: AAA 2 :: BBB 3 :: CCC 5 :: DDD 2 :: EEE
Example 4 : Removing duplicate objects based on there ID –
Let we have a class People with name and id as member variables and we want to remove duplicate elements from a vector of class people objects based on ID .
#include <iostream>
#include <algorithm>
#include <vector>
class People
{
public:
std::string MN;
int ID;
People(std::string name, int id) :
MN(name), ID(id) {
}
bool operator <(const People & obj)
{
if (ID < obj.ID)
return true;
else
return false;
}
bool operator ==(const People & obj)
{
if (ID == obj.ID)
return true;
else
return false;
}
};
struct peopleequalcomp
{
bool operator()(const People & fst, const People & snd)
{
if (fst.MN == snd.MN)
return true;
else
return false;
}
};
struct peoplecomp
{
bool operator()(const People & fst, const People & snd)
{
if (fst.MN < snd.MN)
return true;
else
return false;
}
};
int main()
{
std::vector<People> vp = { People("AAA", 1), People("BBB", 2),
People("BBB", 3),People("CCC", 1) ,People("DDD", 5),People("EEE", 2),People("FFF", 3) };
std::sort(vp.begin(), vp.end());
vp.erase(std::unique(vp.begin(), vp.end()) , vp.end());
std::cout << "Removing duplicate Person based on ID ......\n";
std::for_each(vp.begin(), vp.end(), [](People & obj) {
std::cout<<obj.ID<< " : "<<obj.MN<<std::endl;
});
}
Output : Removing duplicate Person based on ID ...... 1 : AAA 2 : BBB 3 : BBB 5 : DDD