我想使用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));
答案 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::begin和std::end功能。例如:
for(auto it1 = std::begin(arr), it2 = std::begin(arr2); it1 != std::end(arr); ++it1,++it2)
*it2 = *it1;
但是,您可以使用std:array或std::vector代替“普通”数组。这是C ++ 11!