【问题标题】:c++ - matrix initialization with comma-separated valuesc++ - 使用逗号分隔值的矩阵初始化
【发布时间】:2015-08-11 01:54:34
【问题描述】:

嗨,我偶然发现了这篇code。它演示了如何使用 dlib 库的矩阵结构。

根据这个可以初始化一个矩阵结构:

M = 54.2,  7.4,  12.1,
    1,     2,    3,
    5.9,   0.05, 1;

这在 C++ 中怎么可能实现?

这是某种运算符重载吗?

【问题讨论】:

  • 为了读者的理智,我建议你不要试图模仿这个怪物。我建议使用std::initialiser_listM = {...};

标签: c++


【解决方案1】:

逻辑

这可以通过重载operator,(运算符逗号)来实现,例如使其将新的浮点值推送到M

需要注意的是operator, 应该始终具有至少一个类类型参数,因此您必须创建一个可隐式转换为浮点值的类(例如通过非explicit 构造函数1 个 doublefloat 类型的参数)。

示例

例如,我们将尝试对std::vector 上的包装器类型执行此操作,并且我们将尝试使M = 1, 2, 3, 4, 5 成为一个有效的表达式,从而生成具有这些元素的std::vector。您会发现这很容易适用于您给出的矩阵示例。

要记住的是operator=operator, 具有更高的优先级(如this table of operator precedence 所示);因此M = 1, 2, 3, 4, 5 将真正被解析为:(((((M = 1), 2), 3), 4), 5)

鉴于此,我们将首先创建带有 operator= 的类 container,该类接受单个值并将其推送到容器中:

template<typename ValueType>
struct container {
    
    explicit container(std::size_t n) {
        vec.reserve(n);
    }
    
    container& operator=(ValueType a) {
        vec.push_back(a);
        return (*this);
    }

    std::vector<ValueType> vec;
    
};

此时我们可以将operator,定义为:

template<typename ValueType>
container<ValueType>& operator,(container<ValueType>& m, ValueType a) {
    m.vec.push_back(a);
    return m;
}

这只是推回一个新的元素值。

现在您可以很容易地看到以下工作正常并打印1 2 3 4 5

int main() {
    container<int> M(5);
    M = 1, 2, 3, 4, 5;
    for (auto i : M.vec) std::cout << i << ' ';
}

Live demo

注意事项

我尽可能不鼓励这种技术。它迫使您对其他运算符(例如 operator=)具有奇怪的语义,并且实际上似乎对 std::initializer_list&lt;T&gt; 的简单使用没有任何添加。

一个更理智的例子是 operator= 如下:

container& operator=(std::initializer_list<ValueType> a) {
    std::copy(begin(a), end(a), back_inserter(vec)); 
    return (*this);
}

然后简单地使用括号:

int main() {
    container<int> M(5);
    M = { 1, 2, 3, 4, 5 };
    for (auto i : M.vec) std::cout << i << ' ';
}

Live demo

【讨论】:

  • 你怎么知道形状(3,3)?
  • @RuggeroTurra 在对象Mmatrix&lt;double&gt; M(3,3);的初始化中传递给构造函数。
  • 这就是 C 人讨厌 C++ 的原因
  • @paulm 这也是 C++ 人讨厌 C++ 超载的人写的原因operator,
  • 非常感谢杰弗里!显然,这样的代码片段表明了一种精神不稳定:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
相关资源
最近更新 更多