【问题标题】:Passing array of vectors as a function parameter (values will not change)将向量数组作为函数参数传递(值不会改变)
【发布时间】:2014-06-04 13:41:37
【问题描述】:

我在一个类中有一组向量:

class MeasurementData
{
private:
    std::vector<double> m_measuredStrengths[3];
}

我想要另一个类的函数来检查它并根据分析传回一个整数,例如

int CStrengthAnalyser::GetBestFit(std::vector<double> measuredStrengths[3])
{
    int bestFit = -1;
    // do stuff
    return bestFit;
}

我对传递这种对象的最佳实践感到有些困惑,另外还要设置我的接收函数以保证原始数据不会发生变化。

我的函数声明是否可以按原样进行,还是需要添加一些最佳实践调整?

【问题讨论】:

  • 该函数可以随意修改原始数据,因为它采用的是指针,而不是数组的副本。也许你想要一个指向 const 向量的指针,或者更好的是 const std::array&lt;std::vector&lt;double&gt;, 3&gt; &amp;

标签: c++ arrays function vector


【解决方案1】:

您现在拥有的功能与以下功能相同:

int CStrengthAnalyser::GetBestFit(std::vector<double> * measuredStrengths )

所以它肯定可以修改vectors。如果您总是处理大小为 3 的数组,则可以将 const 引用到大小为 3 的数组。

int CStrengthAnalyser::GetBestFit(std::vector<double> const (&measuredStrengths)[3])

或者如果你想让它更通用:

struct CStrengthAnalyser
{
  // ...

  template<std::size_t N>
  int GetBestFit(std::vector<double> const (&measuredStrengths)[N])
  { ... }
};

在这种情况下,成员函数定义必须出现在头文件中(或者,准确地说,定义必须在调用点对编译器可见)。

如果您想避免对数组语法的丑陋引用,您可以将 MeasurementData 定义更改为包含 std::array&lt;std::vector&lt;double&gt;, 3&gt; 而不是普通的 C 数组。然后传递对它的引用更干净

int CStrengthAnalyser::GetBestFit(std::array<std::vector<double>, 3> const& measuredStrengths)

最后,您还可以使用前面所示的函数模板推断std::array 的大小。

【讨论】:

  • 我可能更喜欢将 const 引用传递给 std::array 而不是那个东西......
  • @T.C.我也会,但这意味着更改MeasurementData 定义,也许这不是一个选择?我会在答案中提到它。
【解决方案2】:

我建议你在这里使用vector of vectors,比如

    vector<vector<double> > your_measure(3);

当你将它传递给另一个函数时,你可以使用关键字const给它,就像

    my_fun(vector<vector<double> > const & your_vec_vec);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2015-09-28
    相关资源
    最近更新 更多