Este artículo presenta los siguientes contenedores principales de Qt:
- QList<T>
- QLinkedList<T>
- QMap<T>
Además, se explicarán algunos métodos comunes de contenedores:
qSort
qCopy
qFind
- QList<T> es el contenedor genérico más utilizado en Qt
A continuación se muestran sus operaciones habituales:
Adición, eliminación y dos tipos de iteradores
QListIterator y QMutableListIterator
#include <QCoreApplication>
#include<QList>
#include<QDebug>
int main(int argc, char *argv[])
{
QCoreApplication aplicacion(argc, argv);
QList<int> listaEnteros;
// Adición de elementos
for(int contador =0;contador<10;contador++)
{
listaEnteros.append(contador);
// También se puede agregar así
// listaEnteros << contador;
}
// Eliminación de elementos
qDebug()<<"Eliminando elemento en posición 3";
listaEnteros.removeAt(3);
// Recorrido y consulta
foreach (int elemento, listaEnteros) {
qDebug()<<elemento;
}
qDebug()<<"Iterando con QListIterator";
// Iterador constante
QListIterator<int> iterador(listaEnteros);
while(iterador.hasNext())
{
qDebug()<<iterador.next();
if(iterador.hasNext())
qDebug()<<"El siguiente elemento es :"<<iterador.peekNext();
}
// Ir al final y retroceder
iterador.toBack();
while(iterador.hasPrevious())
{
qDebug()<<iterador.previous();
}
qDebug()<<"Iterador modificable QMutableListIterator";
// Iterador modificable
QMutableListIterator<int> iteradorModificable(listaEnteros);
iteradorModificable.insert(13);
iteradorModificable.insert(14);
iteradorModificable.insert(15);
while(iteradorModificable.hasNext())
{
int valorActual = iteradorModificable.next();
if(valorActual==2 || valorActual==6)
{
iteradorModificable.remove();
}
}
// Consulta final
foreach (int elemento, listaEnteros) {
qDebug()<<elemento;
}
return aplicacion.exec();
}
- QLinkedList<T>
QLinkedList<T> es similar a QList<T> con una diferencia importnate: el acceso a sus elementos solo se realiza mediante iterdaores.
Mientras que QList<int> lista permite acceder a sus elementos con lista[i], QLinkedList no admite este acceso y solo puede utilizarse con iteradores.
En términos de rendimiento, QLinkedList puede superar a QList<T> en ciertos escenarios.
#include <QCoreApplication>
#include<QLinkedList>
#include<QDebug>
int main(int argc, char *argv[])
{
QCoreApplication aplicacion(argc, argv);
QLinkedList<int> listaEnlazada;
listaEnlazada << 1 << 2 << 2 << 3 << 4;
qDebug()<<"Accediendo con QLinkedListIterator";
QLinkedListIterator<int> iterador(listaEnlazada);
while(iterador.hasNext())
{
qDebug()<< iterador.next();
}
// Eliminar la primera ocurrencia de 2
listaEnlazada.removeOne(2);
// Agregar elementos al final
listaEnlazada.push_back(3);
listaEnlazada.append(3);
// Eliminar todas las ocurrencias de 3
listaEnlazada.removeAll(3);
qDebug()<<"Recorrido con foreach";
foreach (int elemento, listaEnlazada) {
qDebug()<< elemento;
}
qDebug()<<"Iterador modificable QMutableLinkedListIterator";
QMutableLinkedListIterator<int> iteradorModificable(listaEnlazada);
while(iteradorModificable.hasNext())
{
int valorActual = iteradorModificable.next();
if(valorActual == 1)
{
iteradorModificable.insert(90);
}
if(valorActual == 4)
{
iteradorModificable.remove();
}
qDebug()<<valorActual;
}
qDebug()<<"Re-recorriendo con iterador";
iteradorModificable.toFront();
while(iteradorModificable.hasNext())
{
int valorActual = iteradorModificable.next();
qDebug()<<valorActual;
}
return aplicacion.exec();
}
3 QMap<T>
El tipo QMap es una colección de pares clave/valor (key/value). El resto de sus características son similares a las de los contenedores anteriores.
#include <QCoreApplication>
#include<QMap>
#include<QDebug>
int main(int argc, char *argv[])
{
QCoreApplication aplicacion(argc, argv);
QMap<int,QString> mapa;
mapa.insert(1,"elemento A");
mapa.insert(2,"elemento B");
mapa.insert(3,"elemento C");
QMutableMapIterator<int,QString> iteradorModificable(mapa);
while(iteradorModificable.hasNext())
{
iteradorModificable.next();
qDebug()<<iteradorModificable.key() << ": " << iteradorModificable.value();
}
return aplicacion.exec();
}
A continuación se explican algunos métodos comunes de operaciones con contenedores:
qSort
qCopy
qFind
#include <QCoreApplication>
#include<QList>
#include<QDebug>
#include<QVector>
#include<QStringList>
int main(int argc, char *argv[])
{
QCoreApplication aplicacion(argc, argv);
QList<int> listaNumeros;
listaNumeros << 15 << 3 << 12 << 1 << 9;
// Ordenación completa
qSort(listaNumeros);
foreach (int numero, listaNumeros) {
qDebug()<<numero;
}
qDebug()<<"____________________________";
listaNumeros.clear();
listaNumeros << 15 << 3 << 12 << 1 << 9;
// Ordenación parcial (excluyendo primer y último elemento)
qSort(listaNumeros.begin()+1, listaNumeros.end()-1);
foreach (int numero, listaNumeros) {
qDebug()<<numero;
}
qDebug()<<"______________qCopy______________";
QVector<int> nuevoVector(5);
qCopy(listaNumeros.begin(), listaNumeros.end(), nuevoVector.begin());
foreach (int numero, nuevoVector) {
qDebug()<<numero;
}
qDebug()<<"______________qFind______________";
listaNumeros.clear();
listaNumeros << 5 << 12 << 8 << 5 << 20;
QList<int>::const_iterator iteradorBusqueda = qFind(listaNumeros, 5);
if(iteradorBusqueda != listaNumeros.end())
{
qDebug()<<"Elemento encontrado: " << *iteradorBusqueda;
}
else
{
qDebug()<<"Elemento no encontrado!";
}
return aplicacion.exec();
}