将结构体向量传递给函数

5

我在努力想出一种简单优雅的方法将一个结构体的向量传递给函数。代码如下:

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

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


myFunc会修改这些double吗?还是只是访问它们? - Joseph Mansfield
由于您是通过引用传递的,因此即使您仅使用结构体中的子集,也无需担心是否传递整个向量。 - Roger Rowland
1
好问题。我认为你需要先创建一个单独的向量,然后再传递它。或者你需要完整地传递“myVec”。 - dead programmer
如果不将其提取为单独的向量,您无法做到这一点。有许多方法可以实现那个,但必须以某种方式完成,除非您愿意将myFunc参数所需类型更改为vector<cube> - WhozCraig
3个回答

9

如果你想要使用结构体的某个字段进行计算,那么你必须告诉函数 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内部的公式中使用,您仍然可以通过将其制作为模板来使用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

2
哦,好的。请提醒我那个 cube::*field 的正确名称是什么? - Roddy
2
@Roddy 指向成员的指针。它可以是字段或函数。 - borisbn
@TomKnapen 很抱歉拒绝了你的编辑,但在你的更改后我添加了一些关于模板的内容。尽管如此,我还是按照你的建议编辑了答案。谢谢。 - borisbn
@borisbn 没问题,只需将你第二个示例中的 cube c : vect 更改为 cube & c : vect,以避免额外的复制。 - Tom Knapen
@borisbn 为什么不能在一次函数调用中同时传递两个结构体字段? - Poka

1
你需要创建一个新向量,其中包含 myVec 向量中所有 width 元素。
你可以使用 std::transformstd::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);

1
在调用结束后,将其转换回立方体向量,因为myFunc参数不是const。 - Roddy

0

你需要像在 myFunc 中一样传递向量。但是,由于你正在传递引用,所以不会产生额外的开销。在函数内部,你可以调用

in[position].width;

或类似。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接