【问题标题】: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<int> 毫无意义。你的意思只是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;
}