将1d或2d向量传递给相同类的构造函数

时间:2019-06-25 01:09:23

标签: c++ vector

我要创建类,处理2D双打向量。我想将向量的向量或简单的双精度向量(以防第二维为1个元素宽)传递给构造函数。另外,它是用于编辑基础数据的模式对话框,因此,我通过引用传递矢量。

一些代码以供参考:

class TableEditDialog {
    using Table2d = std::vector<std::vector<double>>;

public:
    TableEditDialog(Table2d & data) : m_data( data ) {}
    TableEditDialog(std::vector<double> & data); // ?

private:
    Table2d& m_data;
};

如果要传递带有N个元素的简单双精度向量,我需要m_datavector<vector<double>>,其中包含一个元素的N个向量或N个元素的一个向量。

我尝试使用委派的构造函数,但没有成功。 另外,我尝试在第二个构造函数中创建新的临时2d矢量,但它打破了通过引用传递以编辑基础数据的想法。

2 个答案:

答案 0 :(得分:2)

使TableEditDialog为类模板,以便可以在构造时指定类型。

template<class T>
class TableEditDialog {
public:
  TableEditDialog(T& data) : m_data( data ) {}
private:
  T& m_data;
};

您还可以创建一个函数来帮助类型推断:

template<class T>
TableEditDialog<T> make_table_edit_dialog(T& data) {
  return data;
}

那么您可以做:

std::vector<double> d1d;
std::vector<std::vector<double>> d2d;

auto ted1 = make_table_edit_dialog(d1d);
auto ted2 = make_table_edit_dialog(d2d);

编辑:

如果要将一维数组的大小写转换为二维数组,可以重载一维向量的构造函数,并通过将向量复制到其中来初始化m_data

class TableEditDialog {
  using Array1d = std::vector<double>;
  using Array2d = std::vector<Array1d>;
public:
  TableEditDialog(Array2d& data) : m_data( data ) {}
  TableEditDialog(Array1d& data) : m_data(1, data) {}
private:
  Array2d m_data;
};

答案 1 :(得分:1)

您可以将1d向量转换为2d向量,以存储元素的引用。这种解决方案的唯一缺点是,直到您完成编辑后,才允许您使用此1d向量进行播放,否则其他地方可能会中断。

以下是示例:

TableEditDialog(std::vector<double> & data) {
    std::vector<std::vector<std::reference_wrapper<double>>> result(data.size());
    std::transform(data.begin(), data.end(), result.begin(), [](double& d) {return {{d}};});
}

尽管,我没有对此进行测试,可能您需要在lambda中使用{{std::forward(d)}}

唯一的问题是您对m_data的定义不同,但是访问语义相同,因此您需要使用模板化代码来访问它,或者使用std :: variant。