Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
添加不带循环C+的数组+; 如何在C++中添加两个相同大小的数组而不编写显式循环 例如: int a[3]={1,2,3}; int b[3]={4,3,2}; int c[3]; //to contain sum of a and b_C++_Arrays_Loops - Fatal编程技术网

添加不带循环C+的数组+; 如何在C++中添加两个相同大小的数组而不编写显式循环 例如: int a[3]={1,2,3}; int b[3]={4,3,2}; int c[3]; //to contain sum of a and b

添加不带循环C+的数组+; 如何在C++中添加两个相同大小的数组而不编写显式循环 例如: int a[3]={1,2,3}; int b[3]={4,3,2}; int c[3]; //to contain sum of a and b,c++,arrays,loops,C++,Arrays,Loops,如果显式循环是不可能的,那么使用一个可能的隐式循环。让标准库为您做这件事 std::transform(a, a + 3, b, c, std::plus<int>{}); std::transform(a,a+3,b,c,std::plus{}); 如果您发现自己经常在相同大小的阵列上执行此操作,您甚至可以将其模板化: template<typename T, std::size_t N> void add_arrays( T (const &a)[N],

如果显式循环是不可能的,那么使用一个可能的隐式循环。让标准库为您做这件事

std::transform(a, a + 3, b, c, std::plus<int>{});
std::transform(a,a+3,b,c,std::plus{});
如果您发现自己经常在相同大小的阵列上执行此操作,您甚至可以将其模板化:

template<typename T, std::size_t N>
void add_arrays( T (const &a)[N], T (const &b)[N], T (&c)[N] ) {
  std::transform(a, a + N, b, c, std::plus<T>{});
}
模板
void add_数组(T(const&a)[N],T(const&b)[N],T(&c)[N]){
std::transform(a,a+N,b,c,std::plus{});
}
编译器会很好,帮你检查大小。你甚至不必停在那里。有很多方法可以使
add_数组
在更多上下文中可用



说了这么多。尽量避免使用原始数组。默认使用
std::array
。它是原始数组上的薄包装,但它具有值语义。如果您出于某种目的需要一个固定的集合(比如说您正在做图形编程,所以您存储坐标),请尝试使用指定的类型来代替它。

如果您确实想要无循环和性能,您可以尝试:

#include <emmintrin.h>
#include <iostream>

alignas(16) int32_t a[4] = {1, 2, 3, 0};
alignas(16) int32_t b[4] = {4, 3, 2, 0};
alignas(16) int32_t c[4];

main()
{
  __m128i simd_a = _mm_load_si128((__m128i*)a);
  __m128i simd_b = _mm_load_si128((__m128i*)b);


  // No loop for addition and performance is here.
  //
  __m128i simd_c = _mm_add_epi32(simd_a, simd_b);

  _mm_store_si128((__m128i*)c, simd_c);

  std::cout << "\n" << c[0] << " " << c[1] << " " << c[2] << " " << c[3];
}
#包括
#包括
alignas(16)int32_t a[4]={1,2,3,0};
alignas(16)int32_-tb[4]={4,3,2,0};
alignas(16)int32_t c[4];
main()
{
__m128i simd_a=_mm_载荷_si128((u m128i*)a);
__m128i simd_b=_mm_load_si128((_m128i*)b);
//这里没有用于添加和性能的循环。
//
__m128i simd_c=_mm_add_epi32(simd_a,simd_b);
_mm_store_si128((_m128i*)c,simd_c);

std::cout你有什么反对循环的方法吗?我必须在我的项目中多次使用加法,因此我希望有一些优化的方法。例如,使用。这大致就是它的用途。
std::valarray
是我想要的。我们再来一次。