我使用Google的Protcol缓冲区将一系列浮点数序列化为RepeatedField。
在反序列化数据时,我使用另一个设置类来为我的游戏类以更合适的形式保存信息。静态CreateFrom
方法提取并转换数据。
class VoxelTerrainSettings
{
public:
std::vector<int> indices;
btAlignedObjectArray<btVector3> vertices;
VoxelTerrainSettings(void);
~VoxelTerrainSettings(void);
static VoxelTerrainSettings CreateFrom(const VoxelTerrainProtoBuf::VoxelTerrainSettings &settings)
{
VoxelTerrainSettings s;
int numIndices = settings.indices().size();
s.indices.reserve(numIndices);
for (int i = 0; i < numIndices; ++i)
{
s.indices.push_back(settings.indices().Get(i));
}
int numVertices = settings.vertices().size();
s.vertices.reserve(numVertices);
int v = 0;
for (int i = 0; i < numVertices; ++i)
{
s.vertices.push_back(btVector3(settings.vertices().Get(v++), settings.vertices().Get(v++), settings.vertices().Get(v++)));
}
return s;
}
//VoxelTerrain Load();
};
但是,从RepeatedField中提取所有元素的当前方法似乎并不优雅。
我尝试采用更有效的方法,但它们都会抛出范围错误。
std::copy(settings.vertices().begin(), settings.vertices().end(), vv.begin());
std::copy(&settings.vertices().Get(0), &settings.vertices().Get(settings.vertices().size() - 1), &vv[0]);
我可以使用哪些方法来提高元素提取效率?
答案 0 :(得分:7)
std :: copy使用std :: front_inserter / std :: back_inserter迭代器类型将值插入容器 请尝试以下方法:
std::copy(settings.vertices().begin(), settings.vertices().end(), std::front_inserter(vv));
答案 1 :(得分:1)
最快的是预先保留空间,然后在一个循环中转换为optimize caching。
s.indices.reserve(settings.indices().size());
s.vertices.reserve(settings.vertices().size());
for (auto& vertex : settings.vertices()) {
s.indicies.push_back(...);
s.verticies.push_back(...);
}