Contenedores Comunes en Qt

Este artículo presenta los siguientes contenedores principales de Qt:

  1. QList<T>
  2. QLinkedList<T>
  3. QMap<T>

Además, se explicarán algunos métodos comunes de contenedores:

qSort

qCopy

qFind

  1. 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();
}

  1. 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();
}

Etiquetas: Qt QList QLinkedList QMap contenedores

Publicado el 7-1 05:11