我正在用C ++编写代码,但我真的很喜欢K / APL的面向数组的风格。
有没有人知道一组好的运算符重载技巧/宏/ ...以允许在C ++中进行一些K / APL风格的编程?
谢谢!
答案 0 :(得分:5)
对于数学,Blitz++是阵列编程的最大库。以下是文档中的一些示例:
#include <blitz/array.h>
using namespace blitz;
Array<int, 1> x(10); // one-dimensional array of 10 int's
firstIndex i; // place holder index
x = 10 * i; // x == 0, 10, 20, 30...
x = 10 * tensor::i; // a short form of the above two expressions
// another example, with array-level assignments and arithmetic
Array<int, 1> a(4), b(4), c(4);
a = 1, 2, 3, 4;
b = 5, 6, 7, 8;
c = a + b;
Blitz ++使用expression templates,一种类似于懒惰评估的模板元编程技术。因此编译器生成的代码不使用任何不必要的临时变量,并且应该与手写循环一样快。
这是感兴趣的等效k代码:
x:10*!10
x
0 10 20 30 40 50 60 70 80 90
a:1 2 3 4
b:5 6 7 8
c:a+b
c
6 8 10 12
答案 1 :(得分:2)
我没有特别关注K / APL,但根据您的观点,您可能会认为std::valarray
提供的某些运算符重载与APL模糊地相似。由于它支持通用角色名称,您(至少在理论上)甚至可以为其中一些提供类似APL的名称。
这仍然留下一些与APL完全不同的特征,例如C ++中具有优先级和关联性的运算符,APL运算符根本不具备这些特性(至少在内存服务的情况下)。