我正在努力弄清楚如何以简单而优雅的方式将结构的Vector传递给函数。代码如下所示:
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
所以我想要的是将宽度向量传递给函数并执行一些计算。这是完全可能还是我必须将完整的vector fo结构传递给函数myFunc()?
答案 0 :(得分:8)
如果要使用struct的某个字段执行某些计算,则必须告诉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.
BTW,即使字段类型不同,但它们可以在myFunc
内的公式中使用,您仍然可以使用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
答案 1 :(得分:1)
您必须创建一个包含width
向量中所有myVec
元素的新向量。
您可以使用std::transform
和std::back_inserter
来执行此操作。
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);
答案 2 :(得分:0)
你需要像在myFunc中那样传递向量。但是,当您传递引用时,不会产生额外的开销。在函数中你可以调用
in[position].width;
或类似。
编辑:正如Aloc所指出的:如果您不打算更改内容,则应该将引用传递给const。