É possível usar elementos de um tipo diferente do contido em um std :: set para realizar pesquisa e exclusão?
Digamos que eu tenha o seguinte:
struct MetadataThingy {
void *actual_thingy;
int some_metadata;
int more_metadata;
bool operator<(MetadataThingy const& other) const {
return actual_thingy < other.actual_thingy;
}
};
Ondeactual_thingy
aponta para alguns dados de importância e eu quero o contêiner ordenado pelo valor deactual_thingy
em vez do valor do elemento apontado, mas preciso armazenar alguns outros dados sobre ele, então criei a classe wrapperMetadataThingy
com um comparador que considera apenas o valor doactual_thingy
ponteiro (em vez de usar um recipiente devoid *
)
Agora, dado o seguinte código:
std::set<MetadataThingy> thingy_set;
void test() {
MetadataThingy m1 { nullptr, 5, 20 };
MetadataThingy m2 { &m1, 1, 2 };
MetadataThingy m3 { &m2, 6, 0 };
thingy_set.insert(m1);
thingy_set.insert(m2);
thingy_set.insert(m3);
MetadataThingy m;
m = *thingy_set.find(m2); // OK.
m = *thingy_set.find(static_cast<void *>(&m2)); // Nope. Can't use a pointer.
}
Como cadaMetadataThingy
pode ser unicamente identificado pelo valor de ponteiro que ele armazena e é ordenado pelo valor do ponteiro, faria sentido encontrar / excluir objetos simplesmente usando umvoid *
como a chave. No momento, porém, eu teria que criar um bonecoMetadataThingy
Cada vez que procuro um elemento, sinto-me realmente desleixado. Eu já considerei usar apenas ummap
com ponteiros como chave eMetadataThingy
como valor, mas desde que cadaMetadataThingy
também deve conter o ponteiro de qualquer maneira, isso parece um pouco redundante. Assim,Existe uma maneira de usar um elemento de um tipo diferente daquele armazenado em um conjunto para localizar ou excluir valores no conjunto, uma vez que os elementos dos dois tipos são mutuamente comparáveis? e que elementos de um tipo podem ser mapeados de maneira única no outro (void *
eMetadataThingy
são isomórficos)? (Eu não incluí nenhum no código acima, mas suponha que haja sobrecargas de operador para compararvoid *
eMetadataThingy
em qualquer ordem.)
Um pouco sobre o problema que estou tentando resolver, para o caso de alguém poder recomendar uma abordagem melhor: preciso solicitar uma coleção por vários critérios, por isso tenho váriosMetadataThingy
contentores, todos ordenados por critérios diferentes. "Metadata" neste caso seria coisa que eu preciso para rastrear as posições dos elementos em todos os recipientes para que eu possa fazer a remoção rápida. Isso soaria como um trabalho perfeito para aumentar os contêineres com vários índices, mas a ordenação desses elementos está mudando constantemente, o que significa que a AFAIK não funcionará.