2011-02-13 87 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]],您可以根据该值进行排序(您将需要一个仿函数)。然后,您可以使用类似的函子,使用二分搜索计算流量达到一定值的时间。