如何在一个范围内处理多个数组?

时间:2014-03-10 11:20:35

标签: c++ arrays c++11

我想使用range for复制数组。有可能吗?

类似的东西(显然不起作用)

unsigned arr[15] = {};
unsigned arr2[15];

for (auto i : arr, auto &j : arr2)
    j = i;

或者是否有一些其他技巧可以避免操作数组的大小,如果我确定它们的长度相同?

UPD 我非常喜欢@PavelDavydov解决方案。但是,任何人都可以提供标准的lib解决方案。 C ++ 11也包含对和元组。

for (auto pair : std::make_tuple(&arr, &arr2));

4 个答案:

答案 0 :(得分:10)

#include <boost/range/combine.hpp>

for (const auto& pair : boost::combine(arr, arr2)) {
  cout << get<0>(pair) << endl;
}

更新:好的,如果你想在没有提升的情况下这样做,你可以实现更高阶的功能。

template <class T, unsigned long FirstLen, unsigned long SecondLen, class Pred> 
typename std::enable_if<FirstLen == SecondLen, void>::type loop_two(T (&first)[FirstLen], T (&second)[SecondLen], Pred pred) {
  for (unsigned long len = 0; len < FirstLen; ++len) {
    pred(first[len], second[len]);  
  }
}

而不是像这样使用它:

loop_two(arr, arr1, [] (unsigned a, unsigned b) {
  cout << a << endl;
});

答案 1 :(得分:5)

#include <iterator>
//.. 

unsigned arr[15] = {};
unsigned arr2[15];

//.. 

auto it = std::begin( arr2 );

for ( unsigned x : arr ) *it++ = x;

最好使用标准算法std::copy,因为它的名称与你的意图有关。

#include <algorithm>
#include <iterator>
//...

std::copy( std::begin( arr ), std::end( arr ), std::begin( arr2 ) );

对于算术类型的数组,您也可以使用C函数memcpy

#include <cstring>

...

std::memcpy( arr2, arr, std::extent<decltype(arr)>::value * sizeof( unsigned ) );

答案 2 :(得分:3)

已经有好几个好的答案,另一个是使用@ {3}}之类的zip迭代器(目前依赖于Boost.Tuple)

#include <redi/zip.h>

int main()
{
  unsigned arr[15] = {};
  unsigned arr2[15];

  for (auto i : redi::zip(arr, arr2))
    i.get<1>() = i.get<0>();
}

答案 3 :(得分:1)

这是可能的。我建议使用std::beginstd::end功能。例如:

for(auto it1 = std::begin(arr), it2 = std::begin(arr2); it1 != std::end(arr); ++it1,++it2)
 *it2 = *it1;

但是,您可以使用std:arraystd::vector代替“普通”数组。这是C ++ 11!