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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top