如何从std::map值的std::向量中找到最小键值

How can I find the minimum key value from an std::vector of std::map values?

本文关键字:std 键值 值的 map 向量      更新时间:2023-10-16

我有一个std::vectorstd::map值:

std::vector<std::map<std::string, double>> dataPoints;

我想找到最低的low值,74.0。这是我目前的申请:

#include <vector>
#include <map>
#include <iostream>
int main() {
    std::vector<std::map<std::string, double>> dataPoints;
    dataPoints.push_back({{{"high", 77.0}, {"low", 74.0}}});
    dataPoints.push_back({{{"high", 78.0}, {"low", 75.0}}});
    dataPoints.push_back({{{"high", 79.0}, {"low", 76.0}}});
    dataPoints.push_back({{{"high", 80.0}, {"low", 77.0}}});
    dataPoints.push_back({{{"high", 81.0}, {"low", 78.0}}});
    return 0;
}

到目前为止,我发现的最接近的是:

double min = std::min_element(dataPoints.begin(), dataPoints.end(), [](std::map<std::string, double> &a, std::map<std::string, double> &b) { return (a["low"] < b["low"]); })["low"];

但这并不完全奏效。

在JavaScript中,我可以实现以下目标:

low = _.min(_.map(dataSegment, function(dataPoints) {
    return dataPoint.low;
}));

您想要的是min_element,而不是max_element。它返回一个迭代器,所以你会想取消引用它

如果"low"不在映射中,我想您可能不想插入零。所以用at代替[];这也使我们能够全面地构成整个事情。

double min = std::min_element(dataPoints.cbegin(), dataPoints.cend(),
              [](const std::map<std::string, double> &a,
                 const std::map<std::string, double> &b) {
                     return a.at("low") < b.at("low"); 
              })->at("low");

Map用于存储键/值对。如果有两个始终相同的关键点,那么使用贴图是没有意义的。您也不需要对这些键进行排序。

如果给定的第一个值为高,第二个值为低,则可以使用:

std::pair <double, double>

这样,每次添加新值时,都会节省两个std::字符串大小的内存空间。

向量在存储无序序列时很有用。根据您是否希望对数据进行排序,您可以在此处使用一个集合,并根据高低进行比较。这将加快找到最小值到恒定时间的速度。

设置:

std::set <std::pair <double, double>>.

Set是一个已排序的容器。有了set,如果您的最低值在顶部,则可以使用begin();如果您的最低点在底部,则使用end()

如果选择未排序,则使用std::vector。如果您的容器经常更改并且可能是,那么您可能需要std::deque。如果您的容器有一个固定大小并且您不打算修改它,那么请使用std::array。在这种情况下,您可以在此处使用min_element。这种类型的搜索是线性时间。

编辑

如果你想坚持std::vector<std::映射<std::string,double>>以下内容应该有效:

//min_element returns std::vector<std::map<std::string, double>>::iterator
auto minDataPoint = std::min_element(dataPoints.begin(), dataPoints.end(), [](std::map<std::string, double> &a, std::map<std::string, double> &b) { 
    return (a["low"] < b["low"]); 
});
std::cout<<"low "<<(*minDataPoint)["low"];

在此处测试:http://ideone.com/sdG6fk