在C ++中,当两个向量属于不同类型时,如何将值存储到向量内部的向量中?

时间:2017-01-31 03:57:20

标签: c++ vector stl

我正在编写一个程序,我需要使用以下数据结构:

struct shape
{  
    std::vector<float> verts; // contains the x & y values for each vertex   
    char type;                // the type of shape being stored.   
    float shapeCol[3];        // stores the color of the shape being stored.   
    float shapeSize;          // stores the size of the shape if it is a line or point
};

在我的主程序中,我需要一个shape类型的向量。如何使用结构形状的向量将值存储到结构形状内的向量中。

例如,vector<shape> myshapes;

如果我想将值存储到verts向量的第一个索引中,在我的myshapes向量的第一个索引中,我该怎么做?

在伪代码中它看起来像这样,i是索引:

myshapes[i].vector[i] = 4;   // but I know this is incorrect

使用STL列表更容易实现,如果是这样,那语法会是什么样的?

感谢我对矢量的帮助,所以任何建议都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

5.11支持使用vector运算符。语法和语义与使用[]运算符和数组非常相似。请参阅:http://en.cppreference.com/w/cpp/container/vector/operator_at

与任何struct成员一样,您需要按名称访问它。 []

给出的一般建议是使用myshapes[i].verts[j] = 4;作为您选择的默认容器。当然,如果您有特殊需求(例如在容器中间添加/移除物品),其他容器可能具有更好的性能特征。

答案 1 :(得分:0)

如果你的向量开始是空的,你必须先添加元素,然后才能用operator[]索引它们。这通常使用push_back(添加现有shape对象)或emplace_back(直接在向量中构建新的shape对象)来完成。

鉴于vector<shape> myshapes,你可以添加一些这样的形状:

// add 10 shapes
for (size_t n = 0; n < 10; n++) {
    shape s; // creates a new, blank shape object

    // initialize the shape's data
    s.type = ...;
    s.shapeSize = ...;
    // etc.

    // add verts
    s.verts.push_back(1.0f);
    s.verts.push_back(2.0f);
    s.verts.push_back(3.0f);
    // etc.

    // add the shape to the vector
    myshapes.push_back(std::move(s));
}

(由于我们在最后一行完成了s,我们可以使用std::move。这样就可以push_back 形状的数据移动到矢量而不是复制它。查找移动语义以获取更多信息。)

一旦你在向量中有东西,就可以按索引访问元素:

myshapes[index of shape].verts[index of vertex within that shape]

使用带有无效索引的[]或向量为空时调用未定义的行为(不执行此操作或程序将崩溃/出现故障)。