是否有更多STL类似/有效的方式来执行以下操作
for (int i=0 ; i< N ; ++i)
{
mystruct[i].key = myfunction(xp[i], yp[i], zp[i]);
mystruct[i].index = i;
}
其中mystruct的类型为
struct KeyIndex
{
int key;
int index;
};
xp,yp,zp是三个大小为N
double xp[N];
double yp[N];
double zp[N];
和myfunction是一些具有签名int myfunction (int, int ,int)
如果我需要将函数myfunction
更改为用于STL目的的仿函数,那就没问题。
答案 0 :(得分:1)
你可以这样做:
struct TheFunctor
{
double *xp, *yp, *zp;
int idx;
TheFunctor(double * Xp, double * Yp, double * Zp) : xp(Xp), yp(Yp), zp(Zp), idx(0) {};
KeyIndex operator()()
{
KeyIndex ret;
ret.key=idx++;
ret.value=myfunction(*(xp++), *(yp++), *(zp++));
}
};
TheFunctor fn(xp, yp, zp);
std::generate(begin(mystruct), end(mystruct), fn);
但它肯定不会更快,而且没有充分理由它更加模糊。正如评论中所述,这是一个简单的for
循环更好的情况之一。
答案 1 :(得分:0)
数据或myfunction
函数中是否有任何结构可以让您计算N
键值而不实际评估mufunction
N
次?
假设您有一个函数sum(n)
,它可以计算数组arr
的元素总和,直到索引n
。如果您使用n
= 1234调用它,则无需为n
= 1235调用它,因为这会无缘无故地添加前1234个数字。在这种情况下sum
(1235)= sum
(1234)+ arr
[1234],计算起来要快得多。
如果您的(xp,yp,zp)参数在数组中出现多次,则会进行另一次优化。在这种情况下,您将使用相同的参数不必要地多次调用myfunction
,希望生成相同的结果。
如果是这样且数据数组很大但包含一组更小的不同值,则可以将结果记忆在各种缓存中。在调用myfunction之前,请检查缓存以查看您是否尚未计算结果。如果您这样做,则使用缓存的值,如果不这样做,则计算并将其添加到缓存中。
否则你不会以任何有意义的方式对其进行优化,而是应该尽可能让它变得可读。