Как получить QVector <T>из QVector <QVector <T>>? - PullRequest
1 голос
/ 27 февраля 2012

У меня есть 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?

Ответы [ 3 ]

1 голос
/ 27 февраля 2012

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

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 .

0 голосов
/ 27 февраля 2012

Вы можете использовать Boost Multi-Array , это обеспечивает многомерный массив.

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

См. Ссылку на учебник и пример.

0 голосов
/ 27 февраля 2012
for (int i = 0; i < vectors.size(); ++i) {
    for(int k=0;k<vectors[i].size();k++){
        collected.push_back(vectors[i][k]);
    }
}

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

...