|
Prev: Exceptions
Next: Pet peeves (lighthearted)
From: Rutger.van.Beusekom on 22 Jul 2005 21:06 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! ] |