2011-02-13 89 views
1

我從一個返回流量(雙倍)和時間(雙倍)的設備獲取數據。我想存儲他們,並能夠訪問數據使用兩種流速來獲取流量的時間和速度...stl:地圖和鏡像數據訪問

我正在使用兩個stl:map容器來做到這一點......有沒有辦法只使用一個容器?

這裏是加載數據的方法: 流數據(SDATA)的逗號分隔的字符串(「11.2,22.3,14.3,12.4,13.3」) 數據收集每個0.25秒 - 所以我們只遞增時間...

void LiquidTest::Load(string sData) 
{ 
    string sFlow; 
    istringstream iss(sData); 

    cout << "Inside LiquidTest::Load()." << endl; 

    double dTime = 0.0; 
    double dFlow = 0.0; 

    while (getline(iss, sFlow, ',')) 
    { 
    // add the flow/time to the map(s) 
    cout << "Adding flow/time to map. sFlow=" << sFlow << ", dTime=" << dTime << "." << endl; 

    // Convert my string to a double 
    std::stringstream s(sFlow); 
    s >> dFlow; 

    // add the flow data and time data to the maps. We will then 
    // be able to access the flow by the time key and the time 
    // by the flow key. Do I need two maps ??? 
    m_mapFlowDataKeyTime.insert(pair<double, double>(dFlow, dTime)); 
    m_mapTimeKeyFlowData.insert(pair<double, double>(dTime, dFlow)); 

    // Increment the time 
    dTime += 0.25; 
    } 
} 

回答

2

你在找什麼是一個雙向映射和一個常見的方式來實現這個確實有兩個單獨的地圖。或者,您也可以使用一些庫實現,如Boost.Bimap

3

使用地圖雙打的搜索元素是一個問題,因爲你不能指望雙打準確比較,並且有輕微的可能性,這將允許重複英寸

如果你真的知道不會有重複在你的數據和沒有NaN值,你只想排序值和進行範圍比較,然後你可以繼續使用地圖。

更有可能你想要的是結構或對的集合,以及以兩種不同方式對它們進行排序的方法。 Boost具有多索引,或者您可以通過設置排序標準輕鬆創建自己的索引。您可能希望將數據存儲在一個標準中,然後在另一個標準中有一個索引。

如果數據是靜態的(即加載一次然後只搜索)很容易維護。如果您不斷添加新項目並刪除項目,則需要更仔細的維護。

列表是存儲的一種方式,因爲您可以在列表的迭代器上編制索引,並且隨着其他元素稍後添加,這些列表將不會失效。如果你想要不刪除其他元素,也很容易刪除這些迭代器。

隨着你的實際數據,你的時間只是0.25的步驟,所以你實際上只需要一個代表流量的雙向量,並且你知道flow[i]中的時間是i/4。然後你可以有int(或size_t)的第二個向量,其中最初是time[i]是我但是然後你基於另一個向量排序。因此time[i]的流程爲flow[time[i]],您可以根據該值進行排序(您將需要一個仿函數)。然後,您可以使用類似的函子,使用二分搜索計算流量達到一定值的時間。