更高效的STL就像执行操作一样,

时间:2012-02-18 22:24:59

标签: c++ stl

是否有更多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目的的仿函数,那就没问题。

2 个答案:

答案 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之前,请检查缓存以查看您是否尚未计算结果。如果您这样做,则使用缓存的值,如果不这样做,则计算并将其添加到缓存中。

否则你不会以任何有意义的方式对其进行优化,而是应该尽可能让它变得可读。