SUMO - Simulation of Urban MObility
VectorHelper.h
Go to the documentation of this file.
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 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines