O caminho para o aprendizado de C ++ STL associativo contêiner mulit (contêiner repetível)

1. multiset

O arquivo de cabeçalho inclui <set> no namespace std

Diagrama de estrutura:

Nessa estrutura, a chave é o valor e o valor é a chave, independentemente de a chave e o valor estarem juntos.

 Pode haver dados repetidos . (A estrutura é baseada na árvore vermelho-preto (árvore b binária simétrica) para ajustar automaticamente o equilíbrio da estrutura)

função:

1. inserir (elemento)

Insira um elemento ou intervalo de elementos em um conjunto múltiplo. Existem várias sobrecargas desta função, consulte a documentação oficial

2. encontrar (encontrar o alvo)

Passe um parâmetro, o parâmetro é chave / valor a pesquisar, esta pesquisa de estrutura é muito rápida. Quase 0 milissegundos

3. tamanho

Retorna o número de todos os elementos no contêiner;

4. começar ()

Retorna um iterador do primeiro elemento do contêiner

5. end ()

Retorna um iterador do próximo elemento do último elemento do contêiner

6. apagar ()

Remova o elemento correspondente

parâmetro:

Onde
está a localização do elemento a ser removido.

Primeiro
A posição do primeiro elemento a ser removido.

O último
a ser removido está logo além da posição do último elemento.

Key
O valor-chave do elemento a ser removido.

Existem muitas maneiras de esperar. Consulte a documentação relacionada da  classe multiset

exemplo:

#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álise: 1. O código-fonte acima é principalmente para solicitar quanto espaço de contêiner inserir e, em seguida, inserir um número aleatório com inserir. Este número aleatório é processado como um tipo de string, quanto tempo leva para imprimir e processar este contêiner e o conteúdo do contêiner, por que é 1000000? Porque é repetível, e a utilização do conjunto é melhor, e a função de algoritmo global de localização leva 197 milissegundos para encontrar, e o próprio contêiner leva quase 0 milissegundos, então se o próprio contêiner Este tipo de função está embutido. 2. Por que usar try catch for loops? Como a entrada de 1 milhão de espaço no contêiner pode levar a erros e alocação insuficiente do sistema, ele tenta detectar esse erro.

2. multimapa (valor-chave 容器)

Diagrama de estrutura:

No diagrama de estrutura, um valor-chave corresponde a um valor-chave de valor, mas o valor-chave não pode ser repetido, mas o valor pode ser repetido.

Isso também se baseia na árvore vermelho-preto .

função

1. inserir (elemento)

Insira um elemento ou intervalo de elementos em um conjunto múltiplo. Existem várias sobrecargas desta função, consulte a documentação oficial

2. encontrar (encontrar o alvo)

Passe um parâmetro, o parâmetro é a chave para pesquisar, essa pesquisa de estrutura é muito rápida. Quase 0 milissegundos

3. tamanho

Retorna o número de todos os elementos no contêiner;

4. começar ()

Retorna um iterador do primeiro elemento do contêiner

5. end ()

Retorna um iterador do próximo elemento do último elemento do contêiner

Existem muitos outros métodos, consulte a classe de multimapa de informações

Exemplo:

#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 da operação:

Análise do código fonte:

Apresente o arquivo de cabeçalho #include <map>

No exemplo, há uma frase usando o par <long, string> (i, buf). Quando está entre aspas, esse multimapa é uma combinação de chave e valor, portanto, é necessário combinar a chave e o valor, então isso é citada, que é fornecida pela biblioteca padrão., Outra estrutura é chamada de " par " (um par é duas coisas (chave e valor)) ou imprime o tempo que leva para abrir um milhão de contêineres como no exemplo anterior. Use try catch para detectar erros no processo de desenvolvimento. E, finalmente, use a função find que vem com c.find (key) para encontrar a chave e retornar um iterador (pode-se dizer que é um ponteiro) ... Mas este iterador tem duas propriedades: uma é a primeira, a primeira é longa na frente O que é definido é o valor da chave, e a segunda é o valor do tipo de string definido pelo par anterior. Finalmente, o resultado é impresso ...

Acho que você gosta

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