From: Rutger.van.Beusekom on
How about this one?

#include <cassert>
#include <iostream>
#include <list>

template <typename T>
struct element_wrapper
{
T t_;
size_t i_;
element_wrapper(const T& t, size_t i)
: t_(t)
, i_(i)
{}
friend std::ostream& operator << (std::ostream& os,
const element_wrapper<T>& e)
{
return os << e.t_;
}
friend bool operator == (const element_wrapper<T>& lhs,
const element_wrapper<T>& rhs)
{
return lhs.t_ == rhs.t_;
}
};

struct insertionOrder
{
template <typename T>
bool operator()(const element_wrapper<T>& lhs,
const element_wrapper<T>& rhs) const
{
return lhs.i_ < rhs.i_;
}
};

struct valueOrder
{
template <typename T>
bool operator()(const element_wrapper<T>& lhs,
const element_wrapper<T>& rhs) const
{
return lhs.t_ < rhs.t_;
}
};


int main()
{
const char elems[] = "ABBACADABRA" "AND" "YABBADABBADOO";
const char* ref = "ABCDRNYO";

typedef element_wrapper<char> element;
std::list<element> list;

for(size_t i = 0; i < sizeof(elems); ++i)
{
list.push_back(element(elems[i], i));
}

list.sort(valueOrder());
list.unique();
list.sort(insertionOrder());

typedef std::list<element>::const_iterator constiter;
for(constiter it = list.begin(); it != list.end(); ++it)
{
std::cout << *it;
assert(it->t_ == *ref++);
}
std::cout << std::endl;

return 0;
}

Rutger


[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

First  |  Prev  | 
Pages: 1 2 3 4
Prev: Exceptions
Next: Pet peeves (lighthearted)