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 ...