[C ++] - el número de frutos con un mapa aparece estadísticas

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.
Aquí Insertar imagen Descripción

- 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);
			}
		}
	}
	
}
Publicado 33 artículos originales · alabanza ganado 13 · vistas 1061

Supongo que te gusta

Origin blog.csdn.net/Vicky_Cr/article/details/104341462
Recomendado
Clasificación