QVector size () возвращает нулевой размер - PullRequest
0 голосов
/ 14 сентября 2011

Эти две функции - моя попытка сериализации QVector. К сожалению, я не могу использовать QDataStream, потому что мой начальник требует, чтобы реализация была независимой от Qt, а QDataStream добавлял заголовок. Таким образом, проблема в том, что вектор, возвращаемый функцией binToVector, возвращает размер, равный 0, но если элементы печатаются, они равны исходному вектору. Почему возвращаемый размер равен нулю, если вектор имеет элементы, равные оригиналу? Эти функции сериализации в порядке? Я не могу использовать boost или функции Qt для его реализации, только C ++;

QByteArray vectorToBin(const QVector<qint32> & vec)
{
  QByteArray result;
  foreach(quint32 e, vec) {
    char *src = reinterpret_cast<char*>(&e);
    result.append(src, sizeof(qint32));
  }
  return result;
}

QVector<qint32> binToVector(const QByteArray & bytes) 
{
  int size = sizeof(qint32);
  QVector<qint32> result;
  result.reserve(bytes.count()/size);
  int j=0;
  for(int i=0; i<bytes.count(); i+=size) {
    memcpy(&result[j++], bytes.constData()+i, size);
  }
  return result;
}

1 Ответ

6 голосов
/ 14 сентября 2011

Вы вызываете QVector::reserve, который выделяет память для класса для использования в качестве хранилища, но фактически не меняет количество вещественных элементов в контейнере. Для этого вам нужно QVector::resize. Стандартный класс C ++ vector работает так же. Предварительное резервирование места гарантирует, что повторным вызовам append в будущем не придется постоянно перераспределять хранилище контейнера.

...