[英]What is the most efficient way to get all elements from a ProtoBuf RepeatedField?
我已經連載float數組到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]);
我可以使用哪些方法來提高元素提取效率?
std::copy 使用 std::front_inserter/std::back_inserter 迭代器類型將值插入容器嘗試以下操作:
// inserting into list/deque
std::copy(settings.vertices().begin(), settings.vertices().end(), std::front_inserter(vv));
// inserting into vector
std::copy(settings.vertices().begin(), settings.vertices().end(), std::back_inserter(vv));
最快的是預先預留空間,然后在一個循環中轉換以優化緩存。
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(...);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.