修改结构

时间:2016-08-01 08:25:23

标签: c++ struct

我有一个充满向量的结构。

struct structtype{

vector<double> vec1;
vector<double> vec2;
vector<int> vec3;

};

我希望能够从一个结构中获取特定元素并将它们添加到另一个结构中。有点像

structtype myStructA

myStructA.add(myStructB.at(i))

所以我在myStructA的特定元素中构建myStructB。我想知道在structtype的定义中我是否可以包含类似的内容。

struct structtype{

vector<double> vec1;
vector<double> vec2;
vector<int> vec3;

void Add(structtype myStructtoAdd, int i){
vec1.push_back(myStructtoAdd.vec1.at(i));
vec2.push_back(myStructtoAdd.vec2.at(i));
vec3.push_back(myStructtoAdd.vec3.at(i));
};


};

这会有用吗?无论有没有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

是。它会起作用,因为在c ++中structclass非常相似,并且它们支持方法。不同之处在于默认情况下会员的可访问性 - class他们是私密的,而struct他们是公开的。它也适用于继承 - struct公开和类私有地继承(默认情况下 - 它在两种情况下仍然是posiblle,以添加所需的访问说明符)

答案 1 :(得分:0)

是的,这会有用。

关于此代码的改进:

由于您需要将元素i从一个结构添加到另一个结构,可能您可能需要对此元素执行任何其他操作,因此为它定义结构和检索运算符看起来很合理:

struct element
{
    double f1, f2;
    int f3;
}

element& structtype::operator [] (int i)
{
    return {vec1[i], vec2[i], vec3[i]};
}

const element& structtype::operator [] (int i) const
{
    return {vec1[i], vec2[i], vec3[i]};
}

执行这些操作后,您可能会将element存储在其他地方,而不仅仅存储在structtype中,这意味着使用push_back参数的element操作会很有用:

void push_back(const element& e)
{
    vec1.push_back(e.f1);
    vec2.push_back(e.f2);
    vec3.push_back(e.f3);
}

此外,假设structtype类的行为类似于容器,实现典型的STL容器提供的其他功能(如迭代器)可能很有用。类似STL的容器实现的良好指南是here

或者,作为第二种选择,您可以使用std::vector<element>,它已经实现了所有这些功能。

如果它的功能不够,您可以扩展它,创建一个继承std::vector实现的新类。执行此操作的标准方法是使用private继承,如下所示:

class structtype : private std::vector<element>
{
public:
    /// Write such lines for all members of std::vector which you would like to have
    using std::vector<element>::size(); 
    ...
    /// Write some your own methods
    std::vector<double> get_vec1() const;
}