Uma das grandes vantagens de programar em C++ ao inves de C e a utilizacao da STL (Standard Template Library). Ela disponibiliza Containers, Iterators, Algoritmos e Funcoes Objetos. Nesse post irei abordar uma caracteristica de busca no container MAP e MULTIMAP.Container sao objetos que armazenam outros objetos e o metodo de acessar esses objetos. Por exemplo, posso contruir um vetor de inteiros (vector<int> v). Qual a vantagem de utilizar um vector ao inves de criar um elemento do tipo int v[10]? Se voce reparar, vera que na declaracao do vector eu nao especifiquei o tamanho. Isso mesmo, ele e auto dimensionavel. Ele tambem tem algumas funcoes que facilitam a manipulacao de seus elementos.Outra coisa muito interessante que C++ tem e a classe string. A classe string e um container de char's, que tem algumas funcoes que facilitam a manipulacao dos elementos. Tambem e auto redimensionavel.Os containers MAP e MULTIMAP sao containers associativos com 2 elementos, uma chave e um dado. A diferenca e que no map, a chave e unica, e no multimap, a chave pode se repetir. A construcao basica de um map seria map<int, string> m, onde o primeiro elemento e a chave.E possivel acessar o elemento atraves de sua chave, por exemplo, tenho um map com os seguintes pares: 1, primeiro; 2, segundo; 3, terceiro; 4, quarto. A funcao m.find(3) ira retornar um iterator (que deve ser declarado como map<int, string> it, por exemplo) que aponta para o elemento de chave 3. Para acessar o dado, eu faria string elemento = (*it).second.Mas e se a chave for uma string (map<string, string> mstring), a busca sera case sensitive. Para realizar busca case insensitive e preciso implementar o metodo de busca, e ele deve ser especificado na declaracao da variavel.No caso, eu criei um utils.h com o seguinte codigo:#ifndef UTILS_H#define UTILS_H#include <string>#include <algorithm>using namespace std;struct ltstr{ bool operator()(string s1, string s2) const { string s1Tmp, s2Tmp; s1Tmp = s1; s2Tmp = s2; transform(s1Tmp.begin(), s1Tmp.end(), s1Tmp.begin(), ::toupper); transform(s2Tmp.begin(), s2Tmp.end(), s2Tmp.begin(), ::toupper); return s1Tmp.compare(s2Tmp) < 0; }};#endif // UTILS_HPara declarar a variavel map basta fazer como abaixo:#include <map>#include <string>#include "utils.h"#include <iostream>using namespace std;int main(){ map<string, string, ltstr> mstring; map<string, string, ltstr>::iterator it; mstring.insert(pair<string, string>("a", "primeiro")); mstring.insert(pair<string, string>("b", "segundo")); mstring.insert(pair<string, string>("c", "terceiro")); mstring.insert(pair<string, string>("D", "quarto")); mstring.insert(pair<string, string>("e", "quinto")); it = mstring.find("d"); if (it != mstring.end()) { cout << "elemento procurado: " << (*it).second.c_str() << endl; } return 0;}Essa solucao funciona tambem para o elemento multimap. Recentemente no meu trabalho tivemos um pequeno problema quando o pessoal do desenvolvimento teve que alterar algumas aplicacoes que autenticavam no Active Directory, e que precisam agora autenticar em outro servico de diretorio (o Fedora Directory Server).As aplicacoes sao em sua maioria em ASP, mas nao o ASP .net, mas o ASP mais antigo.Essa linguagem tem uma caracteristica (ou seria uma limitacao???) interessante ao acessar diretorios. Ela faz um cache do schema dos objetos do diretorio localmente. Mas esse cache, pelo que percebemos, tem certa dificuldade em armazenar atributos que nao sao padrao do Ldap. Ou seja, se voce precisou criar algum atributo, o ASP nao ira conseguir determinar