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