[C ++] - cómo usar el mapa y el conjunto de lo que la diferencia entre ellos ??

prefacio

Sabemos que la biblioteca STL C ++ no sólo nos proporciona con el vector, la secuencia, lista y otros recipientes convenientes, más importante aún, el paquete STL muchas estructuras de datos, algoritmos y estructuras de datos complejas operaciones. Embalaje variedad de vectores, la lista de la lista el paquete, el mapa y ajustar los paquetes binarios , en estos contenedores, servirá de base para la operación: añadir, eliminar, ordenar, buscar y similares.

1, conjunto

mapa y conjunto son contenedor asociado, que se caracteriza por la adición o eliminación impacto en el iterador es muy pequeña, además de la operación de nodo, casi ningún impacto en otros nodos

conjunto se utiliza para almacenar el mismo tipo de datos, cuyos elementos son solamente un valor clave , que es compatible con la palabra clave eficiente consulta y la inserción de las operaciones, tales como la comprobación de si una palabra clave en el conjunto. Si existía antes de este valor de clave, no se inserta.

La siguiente es una funciones de uso común en el mapa y conjunto, aquí inserto, y encontrar métodos de borrado:
Aquí Insertar imagen Descripción

Insertar el mecanismo:

	set<int> s;
	s.insert(1);
	s.insert(1);
	s.insert(2);
	s.insert(3);
	s.insert(3);
	s.insert(4);
	for (auto e : s)
	{
		cout << e << " ";
		++e;
	}
	cout << endl;
	//或者你可以采用一下输出方式
	//set<int> iterator::it;
	//for(it=s.begin();it!=s.end();it++)
	//{ 
	//		cout<<*it<<" ";
	//}
	//	cout<<endl;
	

Ejecutar tiro:
Aquí Insertar imagen Descripción
se puede ver el inserto se fija para reordenar +
Búsqueda Buscar:

set<int>::iterator pos = s.find(3);
	if (pos != s.end())
	{
		cout << "找到啦!"<<endl;
	}

tiro ejecutar:
Aquí Insertar imagen Descripción
borrado de borrado:

s.erase(pos);
	cout << "删除后:" << endl;
	for (auto e : s)
	{
		cout << e << " ";
		++e;
	}
	cout << endl;

Captura de pantalla:
Aquí Insertar imagen Descripción
Vaciar claro:

s.clear();
	for (auto e : s)
	{
		cout << e << " ";
		++e;
	}

Captura de pantalla:
Aquí Insertar imagen Descripción

2, mapa

mapa son los mismos que conjunto y el contenedor asociado, el fondo del recipiente que son árbol rojo-negro, de la diferencia es que el mapa no es del valor como una clave y valores de clave están separados

Insertar Insertar

map<string, string> m;
	m.insert(make_pair("Apple", "苹果"));
	m.insert(make_pair("Pair", "梨"));
	m.insert(make_pair("Right", "右边"));
	//m.insert(make_pair("Right", "正确"));
	m.insert(make_pair("Banana", "香蕉"));
	m.insert(make_pair("Orange", "橘子"));
	m.insert(make_pair("Grap", "葡萄"));

	for(map<string,string>::iterator e=m.begin();e!=m.end();e++)
	{
		cout << e->first << ":" << e->second << endl;
	}
	cout << endl;

Encontrar Encontrar

it = m.find("Banana");
	if (it != m.end())
	{
		cout << "找到了!该单词的中文是:" << it->second << endl;
	}
	else
	{
		cout << "没有找到!";
	}
	cout << endl;

BORRAR Para borrar

m.erase(it);
	cout << "删除刚找到的元素后,剩余的元素为:" << endl;
	map<string, string>::iterator e1;
	for (e1 = m.begin(); e1 != m.end(); e1++)
	{
		cout << e1->first << ":" << e1->second << endl;
	}

3, la diferencia entre el mapa y el conjunto de

ajustar las siguientes funciones:

  • se establece como el RBTree contenedor subyacente
  • El elemento resultante es no sólo un valor de clave, el valor es la clave
  • No permita que los valores de clave duplicados
  • El elemento resultante de forma automática reordenación +
  • Iterador no se puede configurar para cambiar el valor de

las características del mapa son los siguientes:

  • En la parte inferior de contenedor como un mapa RBTree
  • Todos los elementos están presentes en el valor de clave +
  • No permita que las claves duplicadas
  • Todos los elementos se ordenan automáticamente por clave
  • La clave del mapa no se puede cambiar, pero el valor correspondiente a las teclas puede ser modificado

Ubicado en una aplicación sencilla y el mapa, publicó una relación en este caso, es el número de estadísticas aparecen las frutas y las estadísticas de la fruta antes de TopK el favorito recuento del número de frutos

4, multiset 和 multimap

El nombre chino es multiset conjunto múltiple
versión extendida es en realidad una colección de, la diferencia está en el conjunto, un valor puede aparecer sólo una vez, y en múltiples colecciones, un valor puede aparecer varias veces. Y un número de inserción y eliminación se puede hacer en tiempo O (logN), se puede garantizar que el número en la secuencia se ordena.

MultiMap y apoyado por las mismas operaciones de mapa (excepto multimap no admite subscripting), MultiMap permitir que los elementos duplicados. Los siguientes son el código de interfaz común demuestra la multimap:

#include <map> 
#include <string> 
#include <iostream> 
using namespace std; 
 
int main() 
{ 
  ///1. 初始化 
  multimap<int, string> mapStudent; 
  multimap<int, string>::iterator iter, beg, end; 
   
  ///2. 添加元素 
  ///multimap不支持下标操作 
  mapStudent.insert(pair<int, string>(0, "student_one")); 
  mapStudent.insert(pair<int, string>(0, "student_one_copy"));///一对多 
  mapStudent.insert(pair<int, string>(1, "student_two")); 
  mapStudent.insert(pair<int, string>(5, "Fear Kubrick")); 
  mapStudent.insert(pair<int, string>(2, "Akemi Homura")); 
  mapStudent.insert(pair<int, string>(-1, "Eren Jaeger")); 
  mapStudent.insert(pair<int, string>(99, "lin")); 
  cout << mapStudent.size() << endl; 
  cout << endl; 
   
  ///3. 遍历 
  for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++) 
    cout << iter->first << " " << iter->second << endl; 
  cout << endl; 
   
  ///4. 单键查询与范围查询 
  ///单键查询 
  int count = mapStudent.count(0); 
  iter = mapStudent.find(0); 
  for (int i = 0; i < count; i++, iter++) 
    cout << iter->first << " " << iter->second << endl; 
  cout << endl; 
  ///范围查询 
  beg = mapStudent.lower_bound(1);/// >=1 
  end = mapStudent.upper_bound(5);/// <=5 
  for (; beg != end; beg++) 
    cout << beg->first << " " << beg->second << endl; 
  cout << endl; 
   
  ///5. 删除 
  iter = mapStudent.find(1); 
  mapStudent.erase(iter); 
  cout << mapStudent.size() << endl; 
  for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++) 
    cout << iter->first << " " << iter->second << endl; 
  cout << endl; 
   
  ///6. 判空与清空 
  if (!mapStudent.empty()) 
    mapStudent.clear(); 
} 

Publicado 33 artículos originales · alabanza ganado 13 · vistas 1047

Supongo que te gusta

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