005
09.02.2006, 21:43 Uhr
Spacelord
Hoffnungsloser Fall
|
Hi, also die Idee mit der std::map würde ich an deiner Stelle ganz fallen lassen.Damit drehst du dich warscheinlich nur im Kreis. Ich hab mal ne grobe Variante zusammengeschustert in der ich allerdings keine gossartige Fehlerüberprüfung durchführe(keine Überprüfung auf Intervallüberlappung etc.).
Also in etwa in dieser Richtung würde ich es lösen:
float_intervall.h
C++: |
#ifndef __FLOAT_INTERVALL_H #define __FLOAT_INTERVALL_H
class float_intervall { public: float_intervall(float _start=0.0,float _end=0.0,int a_int=0) :start(_start),end(_end),associated_int(a_int){}; ~float_intervall(){}; int get_associated_int()const{return associated_int;} bool contains(float f)const{return(f >= start && f <= end); }//Rundungsprobleme ignoriert ;) private: float start; float end; int associated_int; };
#endif
|
intervall_map.h
C++: |
#ifndef __INTERVALL_MAP_H #define __INTERVALL_MAP_H
#include "float_intervall.h" #include <vector> #include <algorithm> #include <functional>
class intervall_map { public: intervall_map(){init();} ~intervall_map(){}
int find_associated_int(float f)const { int value=0; std::vector<float_intervall>::const_iterator it; it = std::find_if(intervalls.begin(),intervalls.end(), std::bind2nd(std::mem_fun_ref(&float_intervall::contains),f)); if(it != intervalls.end()) value = (*it).get_associated_int();
return value; } private: std::vector<float_intervall> intervalls; void init() { intervalls.push_back(float_intervall(0.0f,1.5f,50)); intervalls.push_back(float_intervall(1.6f,2.9f,100)); intervalls.push_back(float_intervall(11.32f,17.65f,23)); } };
#endif
|
zum Testen:
C++: |
#include <iostream> #include "intervall_map.h"
int main() { intervall_map imap; std::cout<<"Das int zu 0,9 ist: "<<imap.find_associated_int(0.9f)<<std::endl; std::cout<<"Das int zu 12,0 ist: "<<imap.find_associated_int(12.0f)<<std::endl;
return 0; }
|
MfG Spacelord -- .....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes. |