Асимптотически лучшего способа сделать это не существует, потому что вы должны копировать каждый элемент ровно один раз.Тем не менее, вы можете добиться большего успеха, используя операцию массового копирования, такую как memcpy
, чтобы выполнить эту работу за вас:
double *A = (double *)malloc( n*n *sizeof(double));
double *B = (double *)malloc( n *sizeof(double));
double *U = (double *)malloc((n*n+n) *sizeof(double));
/* Copy over A onto U. */
memcpy(U, A, n * n * sizeof(double));
/* Append B to U. */
memcpy((char*)U + n * n * sizeof(double), B, n * sizeof(double));
Это может быть быстрее, потому что логика копирования байтов может быть ручной-optimized.
Вы пометили этот вопрос на C ++, хотя он больше похож на C-код.Тем не менее, если вы используете C ++, вы могли бы написать это так (используя std::copy
):
double *A = new double[n * n];
double *B = new double[n];
double *U = new double[n * n + n];
std::copy(A, A + n * n, U);
std::copy(B, B + n, U + n * n);
Или, что еще лучше, используя std::vector
без открытого управления памятью или указателей:
vector<double> A(n * n);
vector<double> B(n);
vector<double> U;
U.reserve(A.size() + B.size());
U.insert(U.end(), A.begin(), A.end());
U.insert(U.end(), B.begin(), B.end());
Надеюсь, это поможет!