【问题标题】:Convert vector<vector<int>> to QVector<int> or QVector2D<int> or something将 vector<vector<int>> 转换为 QVector<int> 或 QVector2D<int> 或其他东西
【发布时间】:2019-11-29 06:02:45
【问题描述】:

我使用QDataStream将变量写入.dat文件,所以我写入的变量应该是QVector或QVector2D的形式

vector<vector<int>> vec;
// save
QFile file("save.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
out << QVector2D<int>::fromStdVector(vec);

// load
QFile file("save.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
QVector2D<int> qqi;
in >> qqi; vec = qqi.toStdVector();

错误:QVector2D 不是模板:out

【问题讨论】:

标签: c++ qt vector qvector


【解决方案1】:

您不需要使用 Qt 类型来写入数据流。只需序列化vec 中的数据即可。为此,您还需要存储结构的大小。

int
main( int argc, char** argv ) {
  std::vector<std::vector<int>> vec;
  vec.resize( 2 );
  vec[0] = { 1, 2 };
  vec[1] = { 3, 4, 5 };
  // save
  {
    QFile file( "save.dat" );
    file.open( QIODevice::WriteOnly );
    QDataStream out( &file );
    out << vec.size();
    for( auto& inner : vec ) {
      out << inner.size();
      out.writeBytes(
          reinterpret_cast<const char*>( inner.data() ),
          inner.size() * sizeof( int ) );
    }
  }
  vec.clear();
  {
    // load
    QFile file( "save.dat" );
    file.open( QIODevice::ReadOnly );
    QDataStream in( &file );
    size_t num;
    in >> num;
    vec.resize( num );
    for( auto& inner : vec ) {
      in >> num;
      inner.resize( num );
      auto buffer = reinterpret_cast<char*>( inner.data() );
      uint bytes = num * sizeof( int );
      in.readBytes( buffer, bytes );
    }
  }
}

【讨论】:

    【解决方案2】:

    正如@Thomas 所说,QVector2D 不是模板。所以QVector2D&lt;int&gt; 毫无意义。你的意思只是QVector2D,虽然这是floats 的2-vector。

    我不清楚您的问题,因为我不确定您是否要使用QDataStream,或者这只是您想出的一种方式。因为如果你不需要保存,答案就是

    QVector<QVector2D> toQtTypes(const std::vector<std::vector<int>>& v) {
        QVector<QVector2D> result;
        for (const auto& point : v) {
            Q_ASSERT(point.size() == 2);
            if (point.size() == 2) {
                result.push_back(QVector2D(point[0], point[1]));
            }
        }
        return result;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 2020-12-14
      • 2013-03-15
      • 2011-07-11
      • 2023-01-20
      • 1970-01-01
      相关资源
      最近更新 更多