gpt4 book ai didi

c++ - 使用逗号分隔值的矩阵初始化

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:47 24 4
gpt4 key购买 nike

嗨,我看到了这 block code .它演示了如何使用 dlib 库的矩阵结构。

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

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

这在 C++ 中怎么可能?

这是某种运算符重载吗?

最佳答案

逻辑

这可以通过重载 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) .

鉴于此,我们将从创建我们的类开始 containeroperator=它采用单个值并将其推送到容器中:

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

Live demo

关于c++ - 使用逗号分隔值的矩阵初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30508562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com