大佬教程收集整理的这篇文章主要介绍了c – 使用逗号分隔值进行矩阵初始化,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
根据这个,可以通过以下方式初始化矩阵结构:
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 << ' '; }
注意事项
我尽可能地劝阻这种技术.它迫使你为其他运算符设置奇怪的语义,例如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 << ' '; }
以上是大佬教程为你收集整理的c – 使用逗号分隔值进行矩阵初始化全部内容,希望文章能够帮你解决c – 使用逗号分隔值进行矩阵初始化所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。