Como obter um QVector<T> de um QVector<QVector<T>>?
Pergunta
Eu tenho um QVector de QVector.E quero coletar todos os elementos em todos os QVectors para formar um novo QVector.
Atualmente eu uso o código assim
QVector<QVector<T> > vectors;
// ...
QVector<T> collected;
for (int i = 0; i < vectors.size(); ++i) {
collected += vectors[i];
}
Mas parece que operator+=
está na verdade anexando cada elemento ao QVector
.Então, há um uso mais eficiente em termos de tempo QVector
ou um tipo mais adequado para substituir QVector
?
Solução
Se você realmente precisar, então eu faria 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];
Mas observe que isso soa um pouco como uma otimização prematura.Como a documentação destaca:
QVector tenta reduzir o número de realocações pré-alocando até duas vezes mais memória do que os dados reais precisam.
Portanto, não faça esse tipo de coisa a menos que tenha certeza de que isso melhorará seu desempenho.Mantenha a simplicidade (como sua maneira atual de fazer isso).
Edite em resposta ao seu requisito adicional de O(1):Bem, se você estiver inserindo aleatoriamente, é um lista vinculada mas se você está apenas anexando (como foi tudo que você mencionou), você já amortizou O(1) com o QVector.Dê uma olhada a documentação para contêineres Qt.
Outras dicas
for (int i = 0; i < vectors.size(); ++i) {
for(int k=0;k<vectors[i].size();k++){
collected.push_back(vectors[i][k]);
}
}
circuito externo:retire cada vetor dos vetores
laço interno:retire cada elemento do i-ésimo vetor e coloque-o no coletado
Você poderia usar Impulsionar Multi-Array, isso fornece uma matriz multidimensional.
Também é uma biblioteca 'somente cabeçalho', então você não precisa compilar uma biblioteca separadamente, apenas coloque os cabeçalhos em uma pasta do seu projeto e inclua-os.
Veja o link para o tutorial e exemplo.