Вопрос

У меня есть QVector из QVector.И я хочу собрать все элементы во всех QVectors, чтобы сформировать новый QVector.

В настоящее время я использую такой код

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

Но кажется, operator+= фактически добавляет каждый элемент в QVector.Итак, существует ли более эффективное по времени использование QVector или более подходящий тип замены QVector?

Это было полезно?

Решение

Если вы Действительно нужно, тогда я бы сделал что-то вроде:

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];

Но учтите, что это немного похоже на преждевременную оптимизацию.Как документация указывает на то:

QVector пытается сократить количество перераспределений, предварительно выделяя в два раза больше памяти, чем фактически необходимо данным.

Так что не делайте подобных вещей, если вы действительно не уверены, что это улучшит вашу производительность.Держите это простым (как ваш текущий способ сделать это).

Отредактируйте в ответ на ваше дополнительное требование O (1):Ну, если вы вставляете случайно, это связанный список но если вы просто добавляете (поскольку это все, что вы упомянули), у вас уже есть амортизированный O (1) с помощью QVector.Взгляни на документация для контейнеров Qt.

Другие советы

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

внешний цикл:вытащить каждый вектор из векторов
внутренний цикл:вынуть каждый элемент i-го вектора и поместить в собранный

Вы могли бы использовать Повышение мультимассива, это обеспечивает многомерный массив.

Это также библиотека «только заголовки», поэтому вам не нужно отдельно компилировать библиотеку, просто поместите заголовки в папку вашего проекта и включите их.

См. ссылку на руководство и пример.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top