Pregunta

Tengo un QVector de QVector.Y quiero recopilar todos los elementos de todos los QVectors para formar un nuevo QVector.

Actualmente uso el código como este.

QVector<QVector<T> > vectors;
// ...
QVector<T> collected;
for (int i = 0; i < vectors.size(); ++i) {
     collected += vectors[i];
}

Pero parece que operator+= en realidad está agregando cada elemento al QVector.Entonces, ¿existe un uso más eficiente en el tiempo? QVector o un tipo mejor adecuado reemplazar QVector?

¿Fue útil?

Solución

Si usted en realidad Si es necesario, entonces haría algo como:

QVector< QVector<T> > vectors = QVector< QVector<T> >();

int totalSize = 0;
for (int i = 0; i < vectors.size(); ++i)
    totalSize += vectors.at(i).size();

QVector<T> collected;
collected.reserve(totalSize);

for (int i = 0; i < vectors.size(); ++i)
    collected << vectors[i];

Pero tenga en cuenta que esto suena un poco a optimización prematura.Como la documentación Señala:

QVector intenta reducir el número de reasignaciones preasignando hasta el doble de memoria de lo que necesitan los datos reales.

Así que no hagas este tipo de cosas a menos que estés realmente seguro de que mejorará tu rendimiento.Mantenlo simple (como tu forma actual de hacerlo).

Edite en respuesta a su requisito adicional de O(1):Bueno, si estás insertando aleatoriamente, es un lista enlazada pero si solo estás agregando (ya que eso es todo lo que has mencionado), ya has amortizado O(1) con el QVector.Echa un vistazo a la documentación para contenedores Qt.

Otros consejos

for (int i = 0; i < vectors.size(); ++i) {
    for(int k=0;k<vectors[i].size();k++){
        collected.push_back(vectors[i][k]);
    }
}

bucle exterior:sacar cada vector de los vectores
bucle interior:Saque cada elemento en el i-ésimo vector y empújelo hacia el conjunto.

Podrías usar Impulsar múltiples matrices, esto proporciona una matriz multidimensional.

También es una biblioteca de 'solo encabezados', por lo que no necesita compilar una biblioteca por separado, simplemente coloque los encabezados en una carpeta de su proyecto e inclúyalos.

Vea el enlace para el tutorial y el ejemplo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top