Есть два вектора в1 и в2, задача получить третий вектор в3, каждый элемент которого равен логическому ИЛИ соответствующих элементов векторов в1 и в2. Размерности в1 и в2 равны.
Решение в лоб:
int main()
{
std::vector<long> v1(128, 1L);
std::vector<long> v2(128, 2L);
std::vector<long> v3(128, 0L);
for (size_t i = 0; i < 128; ++i)
{
v3[i] = v1[i] | v2[i];
}
for (size_t i = 0; i < 128; ++i)
{
std::cout << v3[i];
}
std::cout << std::endl;
system("pause");
}
Есть ли способ быстрее поочередного обхода каждого элемента?
Хватит думать за компилятор, он тоже умный.
Напишем код и посмотрим на ассемблерный выхлоп:
using vec_t = std::vector<unsigned long>;
void vec_or(const vec_t& a, const vec_t& b, vec_t& c) {
for (size_t i = 0; i < a.size(); i++) {
c[i] = a[i] | b[i];
}
}
Результат компиляции (опции: -O3 -mavx
): https://godbolt.org/z/v8lmGv
Насколько мне известно, команда vorps
оперирует 128-битными числами. Это означает, что за одну операцию цикла честно обрабатывается 128 бит - это 32х uint32_t
или 16x uint64_t
! Разве этого мало?
Я немного схитрил и включил AVX-инструкции, но даже без опции -mavx
(или аналогичной для других компиляторов), получается высокооптимизированный код.
std::valarray
как раз делает то, что вам нужно: выполняет действие сразу со всеми элементами(это класс, наиболее оптимизированный для численных расчетов). Только у него аргументы конструктора в обратном порядке:
std::valarray<long> v1(1L, 128);
std::valarray<long> v2(2L, 128),
v3 = v1 | v2;
И все...
Виртуальный выделенный сервер (VDS) становится отличным выбором
Понимаю, что много вопросов на эту тему уже писалиМне нужно написать программу, которая будет объединять два массива, записывая в 3
В общем над проблемой бьюсь вторые суткиДело в отправке простого multipart/form-data запроса на ssl сервер
Линейный массив A содержит 2*N элементов, значения которых задаются по следующей формуле a[i]:=10*sin(N+i*i)Элементы массива нумеруются с единицы
Допустим у меня есть std::string strХочу ввести с клавиатуры текст, который скопируется в str