2009-04-21 69 views
4

我需要一個結構來保持基於具有範圍中的鍵的值保存值。 我的實現是C++,所以任何STL或升壓將是極好的。結構通過遠程鍵

我具有如範圍密鑰,其是雙和值

  • [0,2) - > VALUE1
  • [2,5) - >數值2
  • [5,10) - >值3

使得搜索的1.23應該返回值1,等等。

現在我正在使用一個包含所有三個部分(key1/key2/value)的矢量進行自定義搜索,但感覺應該有一個更清晰的結構。

編輯:謝謝大家。鑑於這種情況下的範圍應該是連續的且不重疊的,使用upper_bound將可以很好地工作。感謝Range解決方案,他們被歸檔以備將來參考。

+0

是區域相交? – 2009-04-21 16:40:37

+0

不,他們不應該 – sdg 2009-04-21 17:14:08

回答

2

如果你的範圍是連續的,不重疊的,你應該使用std ::地圖和UPPER_BOUND成員函數。或者,您可以使用upper_bound算法的排序向量。無論哪種方式,您只需要記錄範圍的最低值,隨着範圍的上半部分由下一個更高的值來定義。

編輯:我認爲措辭混淆的,所以我決定提供一個例子。在編寫示例時,我意識到你需要upper_bound而不是lower_bound。我總是讓這兩個人感到困惑。

typedef std::map<double, double> MyMap; 
MyMap lookup; 
lookup.insert(std::make_pair(0.0, dummy_value)); 
lookup.insert(std::make_pair(2.0, value1)); 
lookup.insert(std::make_pair(5.0, value2)); 
lookup.insert(std::make_pair(10.0, value3)); 
MyMap::iterator p = lookup.upper_bound(1.23); 
if (p == lookup.begin() || p == lookup.end()) 
    ...; // out of bounds 
assert(p->second == value1); 
+1

那不是,「與範圍的上半部分被下一個較低值來定義。」? – 2009-04-21 17:23:27

3
class Range 
{ 
public: 
    Range(double a, double b): 
     a_(a), b_(b){} 
    bool operator < (const Range& rhs) const 
    { 
     return a_ < rhs.a_ && b_ < rhs.b_; 
    } 
private: 
    double a_; 
    double b_; 
}; 
int main() 
{ 
    typedef std::map<Range, double> Ranges; 
    Ranges r; 

    r[ Range(0, 2) ] = 1; 
    r[ Range(2, 5) ] = 2; 
    r[ Range(5, 10) ] = 3; 

    Ranges::const_iterator it1 = r.find(Range(2, 2)); 
    std::cout << it1->second; 

    Ranges::const_iterator it2 = r.find(Range(2, 3)); 
    std::cout << it2->second; 

    Ranges::const_iterator it3 = r.find(Range(6, 6)); 
    std::cout << it3->second; 

    return 0; 
} 
1

如何沿着這些路線的東西:

#include "stdafx.h" 
#include <iostream> 
#include <string> 
#include <map> 
#include <algorithm> 
#include <sstream> 


class Range 
{ 
public: 
    Range(double lower, double upper) : lower_(lower), upper_(upper) {}; 
    Range(const Range& rhs) : lower_(rhs.lower_), upper_(rhs.upper_) {}; 
    explicit Range(const double & point) : lower_(point), upper_(point) {}; 
    Range& operator=(const Range& rhs) 
    { 
     lower_ = rhs.lower_; 
     upper_ = rhs.upper_; 
     return * this; 
    } 

    bool operator < (const Range& rhs) const 
    { 
     return upper_ <= rhs.lower_; 
    } 

    double lower_, upper_; 
}; 

typedef std::string Thing; 
typedef std::map<Range, Thing> Things; 


std::string dump(const std::pair<Range,Thing> & p) 
{ 
    stringstream ss; 
    ss << "[" << p.first.lower_ << ", " << p.first.upper_ << ") = '" << p.second << "'" << endl; 
    return ss.str(); 
} 

int main() 
{ 
    Things things; 
    things.insert(std::make_pair(Range(0.0, 5.0), "First")); 
    things.insert(std::make_pair(Range(5.0, 10.0), "Second")); 
    things.insert(std::make_pair(Range(10.0, 15.0), "Third")); 

    transform(things.begin(), things.end(), ostream_iterator<string> (cout,""), dump); 

    cout << "--------------------------------------" << endl; 

    things[Range(1.5)] = "Revised First"; 

    transform(things.begin(), things.end(), ostream_iterator<string> (cout,""), dump); 


    return 0; 
} 

...程序的輸出:

[0, 5) = 'First' 
[5, 10) = 'Second' 
[10, 15) = 'Third' 
-------------------------------------- 
[0, 5) = 'Revised First' 
[5, 10) = 'Second' 
[10, 15) = 'Third'