I am new to c++ and stuck to a problem. I am using list for storing string values. now i want to remove the duplicate values from that string. Can anyone tell me how do this.
Any sample code will be highly appreciate.
I am new to c++ and stuck to a problem. I am using list for storing string values. now i want to remove the duplicate values from that string. Can anyone tell me how do this.
Any sample code will be highly appreciate.
If the list is sorted, use its unique method.
If the list isn't sorted (and you don't want to sort it):
set<string> found;
for (list<string>::iterator x = the_list.begin(); x != the_list.end();) {
if (!found.insert(*x).second) {
x = the_list.erase(x);
}
else {
++x;
}
}
To avoid copying the strings into the set:
struct less {
template<class T>
bool operator()(T &a, T &b) {
return std::less<T>()(a, b);
}
};
struct deref_less {
template<class T>
bool operator()(T a, T b) {
return less()(*a, *b);
}
};
void remove_unsorted_dupes(list<string> &the_list) {
set<list<string>::iterator, deref_less> found;
for (list<string>::iterator x = the_list.begin(); x != the_list.end();) {
if (!found.insert(x).second) {
x = the_list.erase(x);
}
else {
++x;
}
}
}
If you have an std::list
you can remove duplicates with:
yourlist.sort();
yourlist.unique();
Use unique().
But first sort() the list, or unique won't do what you expect.
Solution 1:
struct already_found
{
std::set<std::string> & theSet;
bool operator()(const std::string& s) const
{
return !theSet.insert(s).second;
}
};
std::set<std::string> theSet;
the_list.remove_if( the_list.begin(), the_list.end(), already_found(theSet) );
Solution 2 using shared_ptr
struct already_found
{
boost::shared_ptr<std::set<std::string> > theSet;
already_found() : theSet( new boost::shared_ptr<std::set<std::string> > )
{
}
bool operator()(const std::string& s) const
{
return !theSet->insert(s).second;
}
};
the_list.remove_if( the_list.begin(), the_list.end(), already_found(theSet) );
These both have the disadvantage of having to copy all the strings. You can slightly optimise this by storing pointers to the strings and comparing them with a custom compare.