将 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
,尽管那是 float
s 的 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 );
}
}
}
我使用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
,尽管那是 float
s 的 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 );
}
}
}