我正在从返回流量(双倍)和时间(双倍)的设备获取数据。我想存储它们并能够使用流量获取时间和获取流量的时间来访问数据......
我正在使用两个 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;
}
}
最佳答案
使用 double 映射来搜索元素是一个问题,因为您不能指望 double 进行准确比较,并且它有可能允许重复项进入。
如果您确实知道您的数据中不会有重复项,也不会有 NaN 值,并且您只想对值进行排序并进行范围比较,那么您可以继续使用 map。
您更可能想要的是结构或对的集合,以及以两种不同方式对它们进行排序的某种方法。 Boost为此提供了多索引,或者您可以通过设置排序标准轻松创建自己的索引。您可能希望按一个标准对存储的数据进行排序,然后在另一个标准上建立索引。
如果数据是静态的(即加载一次然后仅搜索),则很容易维护。如果您不断添加新项目和删除项目,则需要更仔细的维护。
列表是一种存储方式,因为您可以在列表的迭代器上建立索引,并且这些迭代器不会因为稍后添加其他元素而失效。如果您愿意,也可以很容易地删除这些迭代器而不会使其他元素失效。
对于您的实际数据,您的时间只是 0.25 的步长,因此您实际上可以有一个表示流的 double vector ,并且您知道 flow[i]
中的时间是 i/4 .然后您可以有第二个 int vector (或 size_t),其中最初 time[i]
是 i 但随后您根据另一个 vector 进行排序。因此 time[i]
的流是 flow[time[i]]
并且您可以根据该值进行排序(您将需要一个仿函数)。然后,您可以使用类似的仿函数,使用二进制搜索计算出流量达到一定数量的时间
关于c++ - STL :map and mirrored data access,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4984931/