将 vector<vector<int>> 转换为 QVector<int> 或 QVector2D<int> 或其他

Convert vector<vector<int>> to QVector<int> or QVector2D<int> or something

我使用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 << ...

正如@Thomas 所说,QVector2D 不是模板。所以 QVector2D<int> 是没有意义的。你的意思只是 QVector2D,尽管那是 floats 的 2 向量。

我不清楚你的问题,因为我不确定你是否想使用 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;
}

您不需要使用 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 );
    }
  }
}