El camino hacia el aprendizaje de C ++ de contenedor asociativo de STL mulit (contenedor repetible)

1.multiset

El archivo de encabezado incluye <set> en el espacio de nombres estándar

Diagrama de estructura:

En esta estructura, la clave es el valor y el valor es la clave, independientemente de si la clave y el valor están juntos.

 Puede haber datos repetidos (la estructura se basa en el árbol rojo-negro (árbol b binario simétrico) para ajustar automáticamente el equilibrio de la estructura)

función:

1.insertar (elemento)

Inserte un elemento o rango de elementos en un conjunto múltiple. Hay varias sobrecargas de esta función, consulte la documentación oficial

2.encontrar (encontrar objetivo)

Pase un parámetro, el parámetro es clave / valor para buscar, esta búsqueda de estructura es muy rápida. Casi 0 milisegundos

3.tamaño

Devuelve el número de todos los elementos del contenedor;

4.comienzo ()

Devuelve un iterador del primer elemento del contenedor.

5.end ()

Devuelve un iterador del siguiente elemento del último elemento del contenedor.

6. borrar ()

Eliminar el elemento correspondiente

parámetro:

Dónde
está la ubicación del elemento que se eliminará.

Primero
La posición del primer elemento que se eliminará.

El último
en eliminarse está un poco más allá de la posición del último elemento.

Clave
El valor clave del elemento que se eliminará.

Hay muchas formas de esperar. Consultar la documentación relacionada  clase multiset

ejemplo:

#include <iostream>
#include <ctime>
#include <set>
#include <algorithm>
#include <string>
#include <cstdlib>
using namespace std;
string get_a_string_target();

int main()
{
	srand(time(0));
	clock_t startTime = clock();
	cout << "how many elements: ";
	long int value;
	cin >> value;
	char buf[10];
	multiset<string>c;
	cout << "\ntest_multiset()..........\n";
	for (long i = 0; i < value; i++)
	{
		try
		{
			snprintf(buf, 10, "%d", rand());		//rand()随机数转为字符串

			c.insert(string(buf));
		}
		catch (exception & p)
		{
			cout << "i = " << i << p.what() << endl;
			abort();
		}
	}
	cout << "milli-seconds : " << (clock() - startTime) << endl;
	cout << "multiset.size() = " << c.size() << endl;	//得到元素多少
	cout << "multiset.max_size() = " << c.max_size() << endl;	//得到具体multise容器空间的大小
	string target = get_a_string_target();	//得到一个字符串
	{
		startTime = clock();
		auto pItem = find(c.begin(), c.end(), target);	//用全局的find函数来查找数据
		cout << "::find(), milli-second: " << (clock() - startTime) << endl;
		if (pItem != c.end())
		{
			cout << "found, " << *pItem << endl;
		}
		else {
			cout << "not found " << endl;
		}
	}
	startTime = clock();
	auto pItem = c.find(target);
	cout << "c.find(), milli-second: " << (clock() - startTime) << endl;
	if (pItem != c.end())
	{
		cout << "found, " << *pItem << endl;
	}
	else {
		cout << "not found " << endl;
	}
	system("pause");
	return 0;
}
string get_a_string_target()
{
	int val;
	char buf[10];
	cout << "target (0~" << RAND_MAX << ") : ";
	cin >> val;
	snprintf(buf,  10, "%d", val);
	return string(buf);
}

resultado:

 

Análisis: 1. El código fuente anterior es principalmente para indicar cuánto espacio de contenedor debe ingresar y luego insertar un número aleatorio con insertar. Este número aleatorio se procesa como un tipo de cadena, cuánto tiempo lleva imprimir y procesar este contenedor, y el contenido del contenedor, ¿Por qué es 1000000? Porque es repetible, y la utilización del conjunto es mejor, y la función del algoritmo de búsqueda global tarda 197 milisegundos en encontrar, y el contenedor en sí tarda casi 0 milisegundos, por lo que si el contenedor en sí, este tipo de función está incorporada. 2. ¿Por qué utilizar try catch for bucles? Debido a que la entrada de 1 millón de espacio de contenedor puede provocar errores y una asignación insuficiente del sistema, intenta detectar este error.

2.multimapa (clave-valor 容器)

Diagrama de estructura:

En el diagrama de estructura, un valor de clave corresponde a un valor de clave de valor, pero el valor de clave no se puede repetir, pero el valor se puede repetir.

Esto también se basa en el árbol rojo-negro .

función

1.insertar (elemento)

Inserte un elemento o rango de elementos en un conjunto múltiple. Hay varias sobrecargas de esta función, consulte la documentación oficial

2.encontrar (encontrar objetivo)

Pase un parámetro, el parámetro es la clave para la búsqueda, esta búsqueda de estructura es muy rápida. Casi 0 milisegundos

3.tamaño

Devuelve el número de todos los elementos del contenedor;

4.comienzo ()

Devuelve un iterador del primer elemento del contenedor.

5.end ()

Devuelve un iterador del siguiente elemento del último elemento del contenedor.

Hay muchos otros métodos, consulte la información de la clase multimapa

Ejemplo:

#include <iostream>
#include <ctime>
#include <map>
#include <algorithm>
#include <string>
#include <cstdlib>
using namespace std;
long get_a_long_target();

int main()
{
	srand(time(0));
	clock_t startTime = clock();
	cout << "how many elements: ";
	long int value;
	cin >> value;
	char buf[10];
	multimap<long,string>c;	//key的类型为long 而value类型为string
	cout << "\ntest_multimap()..........\n";
	for (long i = 0; i < value; i++)
	{
		try
		{
			snprintf(buf, 10, "%d", rand());		//rand()随机数转为字符串

			c.insert(pair<long,string>(i,buf));	//使用pair来辅助map加入结构
		}
		catch (exception & p) 
		{
			cout << "i = " << i << p.what() << endl;
			abort();
		}
	}
	cout << "milli-seconds : " << (clock() - startTime) << endl;
	cout << "multiset.size() = " << c.size() << endl;	//得到元素多少
	cout << "multiset.max_size() = " << c.max_size() << endl;	//得到具体multimap容器空间的大小
	long target = get_a_long_target();	//得到一个long类型的数值
	startTime = clock();
	auto pItem = c.find(target);	//查找 key
	cout << "c.find(), milli-second: " << (clock() - startTime) << endl;
	if (pItem != c.end())
	{
		cout << "found, " << (*pItem).second << endl;	//second表示value第二个值 first表示第一个值
		cout << "found, key : " << (*pItem).first << " , value : " << (*pItem).second << endl;
	}
	else {
		cout << "not found " << endl;
	}
	system("pause");
	return 0;
}
long get_a_long_target()
{
	long val;
	cout << "target (0~" << RAND_MAX << ") : ";
	cin >> val;
	return val;
}

resultado de la operación:

Análisis de código fuente:

Introduce el archivo de encabezado #include <map>

En el ejemplo, hay una oración que usa par <long, string> (i, buf). Cuando se cita, este multimapa es una combinación de clave y valor, por lo que es necesario combinar la clave y el valor, por lo que es citado, que es proporcionado por la biblioteca estándar., Otra estructura se llama " par " (un par es dos cosas (clave y valor)) o imprima el tiempo que lleva abrir un millón de contenedores como en el ejemplo anterior. Use try catch para detectar errores en el proceso de desarrollo., Y finalmente use la función de búsqueda que viene con c.find (key) para encontrar la clave y devolver un iterador (se puede decir que es un puntero) ... Pero este iterador tiene dos propiedades: una es la primera, la primera es larga al frente Lo que se define es el valor clave, y la segunda es el valor del tipo de cadena definido por el par anterior. Finalmente, se imprime el resultado ...

Supongo que te gusta

Origin blog.csdn.net/z1455841095/article/details/82700270
Recomendado
Clasificación