c++ - 用另一个类的 vector 生成类的 vector 的函数声明

标签 c++ function vector class-design

我有 2 个类:

class Item;
class Component;

我有一个函数可以从 Componentvector 生成 Itemvector

static vector<Item> generateItemsFromComponents( vector<Component> components )
{
    vector<Item> vi;
    // ...
    return vi;
}

我的问题是,我在哪里声明这个函数?在 Item 类中还是在 Component 类中?还是类(class)设计有误?也许建议更好的方法来实现这一目标?

最佳答案

首先,如果一个Component有一个1对1的转换函数到Item ,你应该考虑:

  • Component 中有一个明确的转换方法,例如Item ToItem(); , 或
  • 有一个隐式转换运算符,但这不太可能除非自动转换(由编译器)在任何情况下都有意义。

例如:

 operator const Item&() const;

一旦你有了可用的单一转换函数,在容器上操作的方法实际上并不属于你现有的任何接口(interface)(除非你已经有一个用于组件容器的类),所以声明一个自由函数是有意义的:

示例:

vector<Item> generateItemsFromComponents( const vector<Component>& components )
{
    vector<Item> vi;
    for(auto& comp in components)
       vi.push_back(comp.ToItem());
    return vi;
}

但是,正如@chris 所指出的,使用 std::transform直接与 lambda 一起使事情变得更容易:

示例:

vector<Item> vi;
transform(begin(comp), end(comp), back_inserter(vi), [](Component c){ return c.ToItem(); }

最后一种方法的优点:

  1. 您不依赖于容器类型:您对迭代器进行操作,comp可以是任何符合标准的容器,而不仅仅是 vector .
  2. 它可能更高效,而且绝对可读性强

回答:

  • 在Component类中提供单一的转换函数
  • 使用标准<algorithm>连同这个功能
  • 考虑用 lambda 代替非常简单的函数
  • 如果一个函数与类型无关,就让它成为一个自由函数

关于c++ - 用另一个类的 vector 生成类的 vector 的函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24223459/

相关文章:

c - C 中的 vector 和矩阵

c++ - for 循环不仅仅在声明的函数处结束,而不是在 main 处结束

java - 矩阵 : get value from given matrix

c++ - 分别声明和初始化 vector<vector<int>>

c++ - 为什么变量 myOperator 没有显示内存位置,为什么没有正确传递

function - Dart中的Function <String,int>?

c++ - 如果我设置现有的 vector = vector<int>(num) 是否会发生内存泄漏?

c++ - 为什么新对象的成员没有被 std::make_unique 初始化?

c++ - 我如何在 Qt 中将 foreach 与 QDomNodeList 一起使用?

c - 如何打乱矩阵