在Map中查找最小值

Sun*_*nny 18 c++ dictionary stl stdmap minimum

我有一张地图,我想在地图中找到最小值(右侧).现在我就是这样做的

bool compare(std::pair<std::string ,int> i, pair<std::string, int> j) {
  return i.second < j.second;
}
////////////////////////////////////////////////////
std::map<std::string, int> mymap;

mymap["key1"] = 50;
mymap["key2"] = 20;
mymap["key3"] = 100;

std::pair<char, int> min = *min_element(mymap.begin(), mymap.end(), compare); 
std::cout << "min " << min.second<< " " << std::endl;
Run Code Online (Sandbox Code Playgroud)

这工作正常,我能够得到问题的最小值当我把这个代码放在我的班级里它似乎不起作用

int MyClass::getMin(std::map<std::string, int> mymap) {
  std::pair<std::string, int> min = *min_element(mymap.begin(), mymap.end(), 
                                                 (*this).compare);
                                                 // Error probably due to "this".
  return min.second; 
}

bool MyClass::compare(
    std::pair<std::string, int> i, std::pair<std::string, int> j) { 
  return i.second < j.second; 
}
Run Code Online (Sandbox Code Playgroud)

还有一个更好的解决方案,不涉及编写附加map功能

rlb*_*ond 14

你有几个选择."最好"的方法是使用仿函数,这是最快的调用:

typedef std::pair<std::string, int> MyPairType;
struct CompareSecond
{
    bool operator()(const MyPairType& left, const MyPairType& right) const
    {
        return left.second < right.second;
    }
};



int MyClass::getMin(std::map<std::string, int> mymap) 
{
  std::pair<std::string, int> min 
      = *min_element(mymap.begin(), mymap.end(), CompareSecond());
  return min.second; 
}
Run Code Online (Sandbox Code Playgroud)

(你也可以在CompareSecond里面嵌套这个类MyClass.

使用现在的代码,您可以轻松地将其修改为可用.只需创建函数static并使用正确的语法:

static bool 
MyClass::compare(std::pair<std::string, int> i, std::pair<std::string, int> j) 
{ 
  return i.second < j.second; 
}

int MyClass::getMin(std::map<std::string, int> mymap) 
{
  std::pair<std::string, int> min = *min_element(mymap.begin(), mymap.end(), 
                                                 &MyClass::compare);
  return min.second; 
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*mmm 13

在C++ 11中,您可以这样做:

auto it = min_element(pairs.begin(), pairs.end(),
                      [](decltype(pairs)::value_type& l, decltype(pairs)::value_type& r) -> bool { return l.second < r.second; });
Run Code Online (Sandbox Code Playgroud)

或者把它放在这样一个很好的函数中(注意我不是模板大师;这在许多方面可能是错误的):

template<typename T>
typename T::iterator min_map_element(T& m)
{
    return min_element(m.begin(), m.end(), [](typename T::value_type& l, typename T::value_type& r) -> bool { return l.second < r.second; });
}
Run Code Online (Sandbox Code Playgroud)