SortUtil.H

Go to the documentation of this file.
00001 /*!@file Util/SortUtil.H Utilities that relate to sorting stuff */
00002 
00003 // //////////////////////////////////////////////////////////////////// //
00004 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2000-2005   //
00005 // by the University of Southern California (USC) and the iLab at USC.  //
00006 // See http://iLab.usc.edu for information about this project.          //
00007 // //////////////////////////////////////////////////////////////////// //
00008 // Major portions of the iLab Neuromorphic Vision Toolkit are protected //
00009 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency //
00010 // in Visual Environments, and Applications'' by Christof Koch and      //
00011 // Laurent Itti, California Institute of Technology, 2001 (patent       //
00012 // pending; application number 09/912,225 filed July 23, 2001; see      //
00013 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status).     //
00014 // //////////////////////////////////////////////////////////////////// //
00015 // This file is part of the iLab Neuromorphic Vision C++ Toolkit.       //
00016 //                                                                      //
00017 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can   //
00018 // redistribute it and/or modify it under the terms of the GNU General  //
00019 // Public License as published by the Free Software Foundation; either  //
00020 // version 2 of the License, or (at your option) any later version.     //
00021 //                                                                      //
00022 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope  //
00023 // that it will be useful, but WITHOUT ANY WARRANTY; without even the   //
00024 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      //
00025 // PURPOSE.  See the GNU General Public License for more details.       //
00026 //                                                                      //
00027 // You should have received a copy of the GNU General Public License    //
00028 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write   //
00029 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,   //
00030 // Boston, MA 02111-1307 USA.                                           //
00031 // //////////////////////////////////////////////////////////////////// //
00032 //
00033 // Primary maintainer for this file:
00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/Util/SortUtil.H $
00035 // $Id: SortUtil.H 14603 2011-03-15 02:06:19Z dparks $
00036 //
00037 
00038 #ifndef UTIL_SORTUTIL_H_DEFINED
00039 #define UTIL_SORTUTIL_H_DEFINED
00040 
00041 #include <vector>
00042 #include <utility>
00043 
00044 namespace util {
00045   //! Get ranks of elements in a vector
00046   /*! Compute the rank of each element ina vector and return all the
00047       ranks in a vector. ranks should initially be empty and will be
00048       filled with rank values for each element in vec, hence upon return
00049       it will have the same size as vec, and ranks[0] is the rank of
00050       vec[0], etc. Rank of 0 is for the smallest element in vec, rank 1
00051       for the second smallest, etc. You need to have operator< defined on T. */
00052   template <class T> inline
00053   void sortrank(const std::vector<T>& vec, std::vector<size_t>& ranks);
00054 
00055   template <class T> inline
00056   void sortrank(const std::deque<T>& vec, std::deque<size_t>& ranks);
00057 
00058 
00059   // ######################################################################
00060   // inline function implementations
00061   // ######################################################################
00062   template <class T> inline
00063   bool sortrankcmp(const std::pair<const T*, size_t>& a, const std::pair<const T*, size_t>& b)
00064   { return ( (*(a.first)) < (*(b.first)) ); }
00065 
00066   template <class T> inline
00067   void sortrank(const std::vector<T>& vec, std::vector<size_t>& ranks)
00068   {
00069     typedef typename std::pair<const T*, size_t> TT;
00070 
00071     std::vector<TT> v;
00072     const size_t n = vec.size();
00073 
00074     for (size_t i = 0; i < n; ++i) v.push_back(TT(&vec[i], i));
00075 
00076     std::sort(v.begin(), v.end(), sortrankcmp<T>);
00077 
00078     ranks.clear();
00079     for (size_t i = 0; i < n; ++i) ranks.push_back(v[i].second);
00080   }
00081 
00082   template <class T> inline
00083   void sortrank(const std::deque<T>& vec, std::deque<size_t>& ranks)
00084   {
00085     typedef typename std::pair<const T*, size_t> TT;
00086 
00087     std::deque<TT> v;
00088     const size_t n = vec.size();
00089 
00090     for (size_t i = 0; i < n; ++i) v.push_back(TT(&vec[i], i));
00091 
00092     std::sort(v.begin(), v.end(), sortrankcmp<T>);
00093 
00094     ranks.clear();
00095     for (size_t i = 0; i < n; ++i) ranks.push_back(v[i].second);
00096   }
00097 
00098 
00099 }; // namespace util
00100 
00101 // ######################################################################
00102 /* So things look consistent in everyone's emacs... */
00103 /* Local Variables: */
00104 /* mode: c++ */
00105 /* indent-tabs-mode: nil */
00106 /* End: */
00107 
00108 #endif // UTIL_SORTUTIL_H_DEFINED
Generated on Sun May 8 08:06:59 2011 for iLab Neuromorphic Vision Toolkit by  doxygen 1.6.3