C ++帮助在地图中查找最大值

时间:2012-02-21 01:33:25

标签: c++ dictionary vector max mode

我一直在做基本程序来找到矢量的最大值,最小值,中值,方差,模式等。一切顺利,直到我进入模式。

我看到它的方式,我应该能够遍历向量,对于每个出现的数字,我在地图上增加一个键。找到具有最高值的密钥将是发生最多的密钥。与其他键相比,它会告诉我它是单个多重模式还是无模式答案。

这是导致我如此麻烦的代码块。

map<int,unsigned> frequencyCount;
// This is my attempt to increment the values
// of the map everytime one of the same numebers 
for(size_t i = 0; i < v.size(); ++i)
    frequencyCount[v[i]]++;

unsigned currentMax = 0;
unsigned checked = 0;
unsigned maax = 0;
for(auto it = frequencyCount.cbegin(); it != frequencyCount.cend(); ++it )
    //checked = it->second;
    if (it ->second > currentMax)
    {
        maax = it->first;
    }
    //if(it ->second > currentMax){
    //v = it->first

cout << " The highest value within the map is: " << maax << endl;

这里可以看到整个程序。 http://pastebin.com/MzPENmHp

9 个答案:

答案 0 :(得分:81)

您可以使用std::max_element查找最高的地图值(以下代码需要C ++ 11):

std::map<int, size_t> frequencyCount;
using pair_type = decltype(frequencyCount)::value_type;

for (auto i : v)
    frequencyCount[i]++;

auto pr = std::max_element
(
    std::begin(frequencyCount), std::end(frequencyCount),
    [] (const pair_type & p1, const pair_type & p2) {
        return p1.second < p2.second;
    }
);
std::cout << "A mode of the vector: " << pr->first << '\n';

答案 1 :(得分:11)

您从未更改过代码中的currentMax

map<int,unsigned> frequencyCount;
for(size_t i = 0; i < v.size(); ++i)
    frequencyCount[v[i]]++;

unsigned currentMax = 0;
unsigned arg_max = 0;
for(auto it = frequencyCount.cbegin(); it != frequencyCount.cend(); ++it ) }
    if (it ->second > currentMax) {
        arg_max = it->first;
        currentMax = it->second;
    }
}
cout << "Value " << arg_max << " occurs " << currentMax << " times " << endl;

找到模式的另一种方法是对矢量进行排序并循环一次,跟踪值变化的索引。

答案 2 :(得分:8)

这是一个基于Rob上面的优秀答案的模板化函数。

template<typename KeyType, typename ValueType> 
std::pair<KeyType,ValueType> get_max( const std::map<KeyType,ValueType>& x ) {
  using pairtype=std::pair<KeyType,ValueType>; 
  return *std::max_element(x.begin(), x.end(), [] (const pairtype & p1, const pairtype & p2) {
        return p1.second < p2.second;
  }); 
}

示例:

std::map<char,int> x = { { 'a',1 },{ 'b',2 },{'c',0}}; 
auto max=get_max(x);
std::cout << max.first << "=>" << max.second << std::endl; 

输出:b =&gt; 2

答案 3 :(得分:2)

你几乎就在那里:只需在currentMax = it->second;

之后添加maax = it->first;

但使用地图来定位最大值是过度的:只需扫描向量并将索引存储在您找到更高数字的位置:与您已编写的内容非常相似,只是更简单。

答案 4 :(得分:2)

作为习惯使用boost库的人,使用Rob提出的匿名函数的替代方法是std :: max_element的以下实现:

std::map< int, unsigned >::const_iterator found = 
        std::max_element( map.begin(), map.end(),
                         ( boost::bind(&std::map< int, unsigned >::value_type::second, _1) < 
                           boost::bind(&std::map< int, unsigned >::value_type::second, _2 ) ) );

答案 5 :(得分:1)

我们可以根据需要重用键或值比较器对象来代替比较器api,同时在任何STL迭代器上获取最小/最大/范围。

http://www.cplusplus.com/reference/map/multimap/key_comp/ http://www.cplusplus.com/reference/map/multimap/value_comp/

==

示例:

// multimap::key_comp
#include <iostream>
#include <map>

int main ()
{
  std::multimap<char,int> mymultimap;

  std::multimap<char,int>::key_compare mycomp = mymultimap.key_comp();

  mymultimap.insert (std::make_pair('a',100));
  mymultimap.insert (std::make_pair('b',200));
  mymultimap.insert (std::make_pair('b',211));
  mymultimap.insert (std::make_pair('c',300));

  std::cout << "mymultimap contains:\n";

  char highest = mymultimap.rbegin()->first;     // key value of last element

  std::multimap<char,int>::iterator it = mymultimap.begin();
  do {
    std::cout << (*it).first << " => " << (*it).second << '\n';
  } while ( mycomp((*it++).first, highest) );

  std::cout << '\n';

  return 0;
}


Output:
mymultimap contains:
a => 100
b => 200
b => 211
c => 300

==

答案 6 :(得分:1)

我们可以使用max_element()函数轻松完成此操作。

代码段:

#include <bits/stdc++.h>
using namespace std;

bool compare(const pair<int, int>&a, const pair<int, int>&b)
{
   return a.second<b.second;
}

int main(int argc, char const *argv[])
{
   int n, key, maxn;
   map<int,int> mp;

   cin>>n;

   for (int i=0; i<n; i++)
   {
     cin>>key;
     mp[key]++;
   }

   maxn = max_element(mp.begin(), mp.end(), compare)->second;

   cout<<maxn<<endl;

   return 0;
 }

答案 7 :(得分:0)

你们写的太多了。只需几行即可完成,这是完整的工作片段:

protected Bitmap doInBackground(String... params) {

    Bitmap bitmap = null;
    HttpURLConnection connection = null;

    try {
        URL url = new URL(params[0]);
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        connection.connect();

        int responseCode = connection.getResponseCode();
        InputStream stream = connection.getInputStream();
        Bitmap mapBitmap = BitmapFactory.decodeStream(stream);

        Paint locaionMarkerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        locaionMarkerPaint.setColor(Color.BLUE);

        bitmap = Bitmap.createBitmap(mapBitmap.getWidth(), mapBitmap.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawBitmap(mapBitmap,0,0, null);
        canvas.drawCircle(mapBitmap.getWidth()/ 2, mapBitmap.getHeight() / 2, 20, locaionMarkerPaint);

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (connection != null) {
            connection.disconnect();
        }
    }

    return bitmap;
}

答案 8 :(得分:-2)

Beter使用内部比较器map :: value_comp()。

例如:

#include <algorithm>
...
auto max = std::max_element(freq.begin(), freq.end(), freq.value_comp());
std::cout << max->first << "=>" << max->second << std::endl

将输出:

Key => Value