Las preguntas del documento antes de CVTE ha habido un problema, significa generalmente que las estadísticas del número de frutos aparecen, y luego llegar antes de las k clases de empleados como para comer la fruta.
Ese problema aquí se puede dividir en dos partes
- un primer recuento es el número de veces que cada una aparece la fruta
Hay tres maneras:
//第一种:
void test_map1()
{
string strs[]={"苹果","香蕉","香蕉","苹果","香蕉","苹果","香蕉","香蕉","草莓"};
map<string,int> countmap;
for(auto str:strs)
{
auto ret=countmap.find(str);
if(ret!=countmap.end())
{
ret->second++;
}
else
{
countmap.insert(pair<string,int>(str,1));
}
}
}
//第二种方法
void test_map2()
{
string strs[] = { "苹果","香蕉","香蕉","苹果","香蕉","苹果","香蕉","香蕉","草莓" };
map<string, int> countmap;
for (auto str : strs)
{
//pair<map<string, int>::iterator, bool> ret = countmap.insert(pair<string, int>(str, 1));
auto ret= countmap.insert(pair<string, int>(str, 1)); //无论是什么水果都进行插入
if (ret.second == false)
{
ret.first->second++;
}
}
}
//第三种方法
void test_map3()
{
string strs[] = { "苹果","香蕉","香蕉","苹果","香蕉","苹果","香蕉","香蕉","草莓" };
map<string, int> countmap;
for (auto str : strs)
{
countmap[str]++;
}
}
Los dos primeros métodos se conocen bien, para está sobrecargado principalmente el tercer método "[]", se vería un poco complicado, prototipo de función es la siguiente:
mapped_type& operator[] (const key_type&k)
{
return (*((this->insert(make_pair(k, mapped_type()))).first)).second;
}
Puede ser difícil de entender, entonces dibujé un diagrama, y finalmente iterador iterador retornos, a continuación, eliminar la referencia volvió iterador es un alias, y luego la lleva al segundo que es fácil de obtener valor por valor.
- El segundo paso es la emisión de un TopK
número de ocurrencias de fruta están ordenadas en orden descendente, eliminar los primeros k elementos
struct compare
{
bool operater()(const pair<string, int>&l, const pair < string, int)&r)
{
return l.second > r.second;
}
};
void test_map3()
{
string strs[] = { "苹果","香蕉","香蕉","苹果","香蕉","苹果","香蕉","香蕉","草莓" };
map<string, int> countmap;
for (auto str : strs)
{
countmap[str]++;
}
vector<pair<string, int>> v;
for (auto &e : countmap)
{
v.push_back(e);
}
sort(v.begin(), b.end(), compare());
//将结果打印出来
for (size_t i = 0; i < k; i++)
{
cout << v[i].first << ":" << v[i].second << endl;
}
}
- Aquí hay una solución cola de prioridad de nuevo
//利用优先级队列解决
void GetFavoriteFruit(const vector<string>&fruits, size_t k)
{
//首先统计每种水果的次数
map<string, int> countmap;
for (auto &e : fruits)
{
countmap[e]++;
}
// 排序,先让前k种水果进入队列,然后大于k的在再次比较他们的次数
priority_queue < pair<string, int>, vector<pair<string, int>, compare>> pq;
size_t i = 0;
for (auto e : countmap)
{
if (i < k)
{
pq.push(e);
++i;
}
else
{
if (e.second > pq.top().second)
{
pq.pop();
pq.push(e);
}
}
}
}