c++ - Map a range of values to a single value -


i need map values ranging between lowerbound , upperbound value.

illustrative example:

for example, imagine have gps system has users subscribed it. system able provide me distance of user point. based on distance of user want assign them id.

thus users in distance

  • 1 100 id: 8.4
  • 101 200 id: 7.2
  • 201 300 id: 3.6
  • 401 600 id: 4.1

and on...

my approach:

so did, created std::map initializing follows:

   std::map<int, double> distancetoidmap;      distancetoidmap =     {             {100, 8.4},             {200, 7.2},             {300, 3.6},     }; 

then use code id given distance:

double rounduptohundred = std::ceil(realdistance / 100.0) * 100; double powerfordistance = distancetoidmap.at(rounduptohundred); 

however approach breaks down 401 600 distance, because ceiling nearest hundred distance of 400+ value 500 don't have entry in map. of course trivial solution add entry 500 distancetoidmap not how want handle problem.

i have map {(lowerbound, upperbound) , correspondingid} structure can address cases id covers distance spanning more 100m. , given can check if lowerbound < realdistance < upperbound , provide id.

it sounds use case std::lower_bound. note lower_bound correct implementation, not upper_bound. code compiles , works. map not need sorted, sorted. should run in o(log(n)).

you'll need catch exception...

#include <iostream> #include <algorithm> #include <map> #include <stdexcept>  using namespace std;  std::map<int, double> distancetoidmap =     {             {100, 8.4},             {200, 7.2},             {300, 3.6},             {600, 4.1}     };     double distance(int user) {     auto x = std::lower_bound(distancetoidmap.begin(), distancetoidmap.end(), std::pair<const int,double>(user,0));     if (x == distancetoidmap.end()) throw std::runtime_error("can't find");     return x->second; }  int main() {     for(int user=25;user < 650;user+=25)     {         cout << user << " " << distance(user) << std::endl;     }    return 0; } 

output:

sh-4.3# g++ -o main *.cpp -std=c++11                                                                                                                                                                                                                     main                                                                                                                                                                                                                                                     sh-4.3# main                                                                                                                                                                                                                                             25 8.4                                                                                                                                                                                                                                                   50 8.4                                                                                                                                                                                                                                                   75 8.4                                                                                                                                                                                                                                                   100 8.4                                                                                                                                                                                                                                                  125 7.2                                                                                                                                                                                                                                                  150 7.2                                                                                                                                                                                                                                                  175 7.2                                                                                                                                                                                                                                                  200 7.2                                                                                                                                                                                                                                                  225 3.6                                                                                                                                                                                                                                                  250 3.6                                                                                                                                                                                                                                                  275 3.6                                                                                                                                                                                                                                                  300 3.6                                                                                                                                                                                                                                                  325 4.1                                                                                                                                                                                                                                                  350 4.1                                                                                                                                                                                                                                                  375 4.1                                                                                                                                                                                                                                                  400 4.1                                                                                                                                                                                                                                                  425 4.1                                                                                                                                                                                                                                                  450 4.1                                                                                                                                                                                                                                                  475 4.1                                                                                                                                                                                                                                                  500 4.1                                                                                                                                                                                                                                                  525 4.1                                                                                                                                                                                                                                                  550 4.1                                                                                                                                                                                                                                                  575 4.1                                                                                                                                                                                                                                                  600 4.1                                                                                                                                                                                                                                                  terminate called after throwing instance of 'std::runtime_error'                                                                                                                                                                                        what():  can't find                                                                                                                                                                                                                                    aborted (core dumped)                                                                                                                                                                                                                                    sh-4.3# main                                                                                                                                                                                                                                             

Comments

Popular posts from this blog

Java 3D LWJGL collision -

spring - SubProtocolWebSocketHandler - No handlers -

methods - python can't use function in submodule -