std::complex
为什么std::comlex接口中不支持直接改变实部或者虚部,
这样的接口设计,主要考虑的是什么?又或者这是标准化进程的历史遗留?
这样多麻烦啊(语法麻烦,还多了个临时对象):
std::complex<double> C;
C = std::complex<double>(3.0, imag(C));
干吗不来个:
C.real() = 3.0;
或者:
C.set_real_component(3.0);
问题点数:20、回复次数:6Top
1 楼ntxs(别人加薪我加班,数钱数到心发酸T_T)回复于 2004-09-01 18:41:39 得分 2
难道就不能 std::complex<double> C(3.0, imag(C))?????
Top
2 楼plainsong(短歌)()回复于 2004-09-01 18:49:28 得分 5
这样是很合理的,因为std::complex的概念就是增加复数类型——就象浮点数是一个类型一样。我们同样无法只修改浮点数的尾数或是阶码。Top
3 楼Wugifer()回复于 2004-09-01 18:53:57 得分 3
可以用 C += 3.0 - C.real ();Top
4 楼whoho(在北方流浪)回复于 2004-09-02 10:37:02 得分 0
上面几种方法:
std::complex<double> C(3.0, imag(C))
C += 3.0 - C.real ();
都有局限性的,
第一种:我如果要在构造以后的适当时机改变,那么就不适用
第二种:这种方法挺好,只是效率上,还是不如直接设定的方式
因为这里包括了一个普通函数,两个运算符(-和+=), 引入了一个临时对象
plainsong(短歌):
我原来也这么考虑过,但是,对复数的分量进行设置是非常普遍的行为
比如我用复数表示复平面内的一个点,而后要把这个点竖直移动到x轴,或者移动到
y=3.0这条直线上
所以我觉得作为复数这个抽象概念来讲,改变其分量并不是破坏抽象的行为
Top
5 楼plainsong(短歌)()回复于 2004-09-02 10:48:51 得分 10
我觉得当你把复数看成是“复平面上的一个点”的时候,这时你用到的概念就不再是一个“数”了,而是一个点。如果你要把复数当作点来进行几何处理时,完全可以通过这个复数来构造一个点。
当然可以让std::complex同时且有“复数”和“点”以及“向量”的概念,但把概念分开可能更好。比如当我提供一个几何库和线性代数库,它们当然有自己的类型point和vector,不可能使用std::complex。如果你已经习惯了把complex当作点或是向量处理,当你决定改用这两个库处理时(可能是因为效率更高或是更健壮,或其它原因),你会遇到一些麻烦。Top
6 楼whoho(在北方流浪)回复于 2004-09-02 14:40:41 得分 0
plainsong(短歌) :
对这个区分我倒是没有注意得很充分,学数学的时候,通常为了
分析的方便,混合使用几种表示法.现在看来,仅从概念出发,
严格地说,当然点、向量和复数,当然不是一回事。不过从
数学领域去看,这三者通常具有非常紧密的联系的,而且经常
彼此映射:三者之间任何两个都可以是一一映射的关系.
复数作为数学概念,理应发挥比较好的媒介作用, 孤立地引入复数
类,而不考虑它的实际用途,我觉得这并不该是库设计的初衷
前几天我在量算地图上的角度时,就使用了std::arg(z1/z2),
(这里的地图坐标是(double,double)),我感觉直接采用这样的办法
非常简便,而且标准库的实现代码通常也高效,合适的时候,
尽量采用标准库,我觉得是很自然的事情.
这个问题看来是仁者见仁智者见智啊.
多谢!
Top




