c – 使用逗号分隔值进行矩阵初始化

前端之家收集整理的这篇文章主要介绍了c – 使用逗号分隔值进行矩阵初始化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
您好我遇到了这篇 code.它演示了如何使用dlib库的矩阵结构.

根据这个,可以通过以下方式初始化矩阵结构:

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

怎么可能在C?

这是某种运算符重载吗?

解决方法

逻辑

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

需要注意的是,运算符应始终至少有一个类类型的参数,因此您必须创建一个可隐式转换为浮点值的类(例如,通过非显式构造函数,其中1个参数类型为double或漂浮).

例如,我们将尝试在std :: vector上为包装器类型执行此操作,并且我们将尝试使M = 1,4,5成为有效表达式,从而生成带有这些的std :: vector元素按顺序排列.您会看到这很容易适用于您提供的矩阵示例.

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

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

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;

};

此时我们可以定义运算符,如:

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,5;
    for (auto i : M.vec) std::cout << i << ' ';
}

Live demo

注意事项

我尽可能地劝阻这种技术.它迫使你为其他运算符设置奇怪的语义,例如operator =,并且似乎没有添加任何简单使用std :: initializer_list< T>.

一个更好的例子是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,5 };
    for (auto i : M.vec) std::cout << i << ' ';
}

Live demo

猜你在找的C&C++相关文章