Более эффективный STL-подобный способ выполнения операции, - PullRequest
0 голосов
/ 19 февраля 2012

Есть ли более 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 ]

1 голос
/ 19 февраля 2012

Вы можете сделать:

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 намного лучше.

0 голосов
/ 19 февраля 2012

Есть ли какая-либо структура в данных или в функции myfunction, которая может позволить вам вычислить значения ключа N без фактической оценки mufunction N раз?

Скажем, у вас естьфункция sum(n), которая вычисляет сумму элементов массива arr до индекса n.Если вы звоните по номеру n = 1234, вам не нужно звонить по номеру n = 1235, потому что это добавит первые 1234 номера без всякой причины.В этом случае sum (1235) = sum (1234) + arr [1234], намного быстрее для вычисления.

Другая оптимизация была бы, если бы появились ваши параметры (xp, yp, zp)несколько раз в массивах.В этом случае вы бы без необходимости вызывали myfunction большое количество раз с одними и теми же параметрами, надеясь получить одинаковые результаты.

Если это так и массивы данных большие, но содержат гораздо меньший набор различных значений, вы можете запоминать результаты в своего рода кэше.Перед вызовом myfunction вы проверяете кеш, чтобы увидеть, не подсчитали ли вы результаты.Используйте кэшированное значение, если вы это сделали или вычислите, и добавьте его в кэш, если вы этого не сделали.

В противном случае вы не собираетесь оптимизировать это каким-либо значимым образом, а вместо этого вы должны стремиться сделать его таким же читабельным,возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...