SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00009 // A simple vector of SUMOReals 00010 /****************************************************************************/ 00011 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/ 00012 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors 00013 /****************************************************************************/ 00014 // 00015 // This file is part of SUMO. 00016 // SUMO is free software: you can redistribute it and/or modify 00017 // it under the terms of the GNU General Public License as published by 00018 // the Free Software Foundation, either version 3 of the License, or 00019 // (at your option) any later version. 00020 // 00021 /****************************************************************************/ 00022 #ifndef VectorHelper_h 00023 #define VectorHelper_h 00024 00025 00026 // =========================================================================== 00027 // included modules 00028 // =========================================================================== 00029 #ifdef _MSC_VER 00030 #include <windows_config.h> 00031 #else 00032 #include <config.h> 00033 #endif 00034 00035 #include <vector> 00036 #include <algorithm> 00037 #include <iostream> 00038 00039 00040 // =========================================================================== 00041 // class definitions 00042 // =========================================================================== 00046 template<class T> 00047 class VectorHelper { 00048 public: 00049 static T sum(const std::vector<T> &v) { 00050 T sum = 0; 00051 for (typename std::vector<T>::const_iterator i = v.begin(); i != v.end(); i++) { 00052 sum += *i; 00053 } 00054 return sum; 00055 } 00056 00057 static void normaliseSum(std::vector<T> &v, T msum = 1.0) { 00058 if (msum == 0) { 00059 // is an error; do nothing 00060 return; 00061 } 00062 T rsum = sum(v); 00063 if (rsum == 0) { 00064 set(v, (T) 1.0 * msum / (T) v.size()); 00065 return; 00066 } 00067 div(v, rsum / msum); 00068 } 00069 00070 static void div(std::vector<T> &v, T by) { 00071 for (typename std::vector<T>::iterator i = v.begin(); i != v.end(); i++) { 00072 *i /= by; 00073 } 00074 } 00075 00076 static void removeDouble(std::vector<T> &v) { 00077 typename std::vector<T>::iterator i = v.begin(); 00078 while (i != v.end()) { 00079 for (typename std::vector<T>::iterator j = i + 1; j != v.end();) { 00080 if (*i == *j) { 00081 j = v.erase(j); 00082 } else { 00083 j++; 00084 } 00085 } 00086 i++; 00087 } 00088 } 00089 00090 00091 static void set(std::vector<T> &v, T to) { 00092 for (typename std::vector<T>::iterator i = v.begin(); i != v.end(); i++) { 00093 *i = to; 00094 } 00095 } 00096 00097 static T maxValue(const std::vector<T> &v) { 00098 SUMOReal m = *(v.begin()); 00099 for (typename std::vector<T>::const_iterator j = v.begin() + 1; j != v.end(); j++) { 00100 if ((*j) > m) { 00101 m = *j; 00102 } 00103 } 00104 return m; 00105 } 00106 00107 static T minValue(const std::vector<T> &v) { 00108 SUMOReal m = *(v.begin()); 00109 for (typename std::vector<T>::const_iterator j = v.begin() + 1; j != v.end(); j++) { 00110 if ((*j) < m) { 00111 m = *j; 00112 } 00113 } 00114 return m; 00115 } 00116 00117 static void remove_smaller_than(std::vector<T> &v, T swell) { 00118 for (typename std::vector<T>::iterator j = v.begin(); j != v.end();) { 00119 if ((*j) < swell) { 00120 j = v.erase(j); 00121 } else { 00122 j++; 00123 } 00124 } 00125 } 00126 00127 static void remove_larger_than(std::vector<T> &v, T swell) { 00128 for (typename std::vector<T>::iterator j = v.begin(); j != v.end();) { 00129 if ((*j) > swell) { 00130 j = v.erase(j); 00131 } else { 00132 j++; 00133 } 00134 } 00135 } 00136 00137 static void add2All(std::vector<T> &v, T what) { 00138 for (typename std::vector<T>::iterator j = v.begin(); j != v.end(); j++) { 00139 (*j) += what; 00140 } 00141 } 00142 00144 static bool subSetExists(const std::vector<T> &v1, const std::vector<T> &v2) { 00145 for (typename std::vector<T>::const_iterator i = v1.begin(); i != v1.end(); i++) { 00146 int val1 = (*i); 00147 if (find(v2.begin(), v2.end(), val1) != v2.end()) { 00148 return true; 00149 } 00150 } 00151 return false; 00152 } 00153 00154 00155 00156 }; 00157 00158 template<class T> 00159 std::ostream& operator<<(std::ostream& os, const std::vector<T> &v) { 00160 for (typename std::vector<T>::const_iterator i = v.begin(); i != v.end(); i++) { 00161 if (i != v.begin()) { 00162 os << ", "; 00163 } 00164 os << (*i); 00165 } 00166 return os; 00167 } 00168 00169 00170 00171 #endif 00172 00173 /****************************************************************************/ 00174