C++ 将结构的向量传递给函数

C++ 将结构的向量传递给函数,c++,C++,我正在努力找出如何以一种简单而优雅的方式将结构的向量传递给函数。代码如下所示: struct cube{ double width; double length; double height; }; vector<cube> myVec; int myFunc(vector<double> &in) { // do something here } int test = myFunc(myVec.width); // NOT POSSIBLE struct cu

我正在努力找出如何以一种简单而优雅的方式将结构的向量传递给函数。代码如下所示:

struct cube{ double width; double length; double height; };
vector<cube> myVec;
int myFunc(vector<double> &in)
{
// do something here
}
int test = myFunc(myVec.width); // NOT POSSIBLE
struct cube{双倍宽度;双倍长度;双倍高度;};
载体myVec;
int myFunc(向量和输入)
{
//在这里做点什么
}
int test=myFunc(myVec.width);//不可能

我只想把宽度向量传递给函数,然后进行一些计算。这是完全可能的还是我必须将结构的完整向量传递给函数myFunc()?

您必须创建一个包含
myVec
向量中所有
width
元素的新向量

你可以使用和来做这件事

std::vector<cube> myVec;
std::vector<double> myWidthVector;

std::transform(std::begin(myVec), std::end(myVec),
               std::back_inserter(myWidthVector),
               [](const cube& c) { return c.width; });

myFunc(myWidthVector);
std::vector myVec;
std::vector myWidthVector;
转换(std::begin(myVec),std::end(myVec),
标准:背面插入器(myWidthVector),
[](常量立方体&c){返回c.width;});
myFunc(myWidthVector);

您需要像在myFunc中一样传递向量。但是,在传递引用时,不会产生额外的开销。在您可以调用的函数中

in[position].width;
或类似的


编辑:正如Aloc指出的那样:如果您不打算更改内容,那么应该传递对常量的引用。

如果您想对结构的某个字段执行一些计算,那么您必须告诉
myFunc
它需要使用的字段。像这样:

void myFunc( std::vector< cube > & vect, double cube::*field ) {
    for ( cube & c : vect ) {
        c.*field // <--- do what you want
    }
}
// calling
myFunc( myVect, & cube::width );
myFunc( myVect, & cube::length );
// etc.

myFunc
是否要修改
double
s?或者只是访问它们?当你通过引用传递时,传递整个向量并不重要,即使你只在结构中使用一个子集的字段。好问题。我认为你必须先创建一个单独的向量,然后传递它。。或者你必须完全传递“myVec”,如果不将其提取到一个单独的向量中,你就不能这样做。有很多方法可以做到这一点,但必须以某种方式来完成,除非您愿意将所需的
myFunc
参数类型更改为
vector
哦,太好了。请提醒我,
cube::*字段
的名称正确吗?@Roddy指向成员的指针。它可以是字段或字段function@TomKnapen很抱歉拒绝了您的编辑,但我在您的更改后添加了一些关于模板的内容。尽管如此,我还是按照你们的建议编辑了答案。感谢you@borisbn没问题,只需将第二个示例中的
cube c:vect
更改为
cube&c:vect
,以避免额外的复制。。。并在调用后将其转换回多维数据集向量,因为myFunc参数不是常量。
template< typename FieldType >
void myFunc( std::vector< cube > & vect, FieldType cube::*field ) {
    for ( cube & c : vect ) {
        c.*field // <--- do what you want
    }
}
// calling will be similar to the first piece