5

GoogleのProtcolBuffersを使用して、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]);

要素抽出をより効率的にするためにどのような方法を使用できますか?

4

2 に答える 2

9

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)); 
于 2012-11-12T07:00:27.577 に答える