我有一个充满向量的结构。
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));
};
};
这会有用吗?无论有没有更好的方法来做到这一点?
答案 0 :(得分:1)
是。它会起作用,因为在c ++中struct
与class
非常相似,并且它们支持方法。不同之处在于默认情况下会员的可访问性 - 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;
}