QVector size() 返回大小为零

Posted

技术标签:

【中文标题】QVector size() 返回大小为零【英文标题】:QVector size() returning size zero 【发布时间】:2011-09-14 18:54:23 【问题描述】:

这两个函数是我尝试序列化 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;

【问题讨论】:

你的老板想要...序列化 QT 数据结构...而不使用 QT? 您已经在使用 QVector,因此您的实现不能独立于 Qt。如果它是标题问题,请尝试前向声明。编写 QDataStream 的内容基本上是在重新发明***。问问你的老板他是否会重新发明***:)) 有点像@DeadMG。他希望序列化碰巧 存储在项目当前版本的Qt 数据结构中的数据。如果有一天他们决定使用特定 Qt 类以外的东西,或者如果他们希望其他不使用 Qt 的项目能够使用相同的序列化数据,他不想被绑定到 Qt 的序列化格式. @Blueskin,“标题”问题与 C++ 标题和前向声明无关。它是关于 QDataStream 在存储数据前面写入头信息,就像位图头在像素数据前面,或者 PE 头在可执行文件前面。 在序列化纯 int 数组时,您很可能需要先写入数组的大小,然后再写入数组的内容。这正是 QList 序列化所做的。 【参考方案1】:

您正在调用QVector::reserve,它为类分配内存以用作存储,但实际上并没有更改容器中真实元素的数量。为此,您需要QVector::resize。标准 C++ vector 类的工作方式相同。提前预留空间可确保以后对append 的重复调用不必一直重新分配容器的存储空间。

【讨论】:

宾果游戏!感谢您的回答。

以上是关于QVector size() 返回大小为零的主要内容,如果未能解决你的问题,请参考以下文章

QVector的内存分配策略

QVector<int>[index] 返回另一个 QVector?

多维数组的Qt QVector

想知道 QVector 的大小

QVector<int> 写入/调整大小性能

返回 QVector 的最佳方式