C++增强型 FOR 环路
我正在从Java切换到C++我想知道C++是否包含我在java中使用的增强的for循环,例如:
int[] numbers = {1,2,3,4,5,6,7,8,9,10};
for (int item : numbers) {
System.out.println("Count is: " + item);
}
在C++中,同样的“捷径”是可能的吗?
我正在从Java切换到C++我想知道C++是否包含我在java中使用的增强的for循环,例如:
int[] numbers = {1,2,3,4,5,6,7,8,9,10};
for (int item : numbers) {
System.out.println("Count is: " + item);
}
在C++中,同样的“捷径”是可能的吗?
C++11确实如此。它们被称为基于范围的 fors。请记住,应将类型限定为对 const 的引用或引用。
C++03 的解决方法是BOOST_FOR_EACH或 boost::bind 与 std::for_each 结合使用。Boost.Lambda可以实现更多花哨的东西。如果你有心情让自己或你的同事感到沮丧,我建议你使用弃用的活页夹和.std::bind1st
std::bind2nd
下面是一些示例代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <boost/lambda/lambda.hpp>
#include <functional>
int main()
{
int i = 0;
std::vector<int> v;
std::generate_n(std::back_inserter(v), 10, [&]() {return i++;});
// range-based for
// keep it simple
for(auto a : v)
std::cout << a << " ";
std::cout << std::endl;
// lambda
// i don't like loops
std::for_each(v.begin(), v.end(), [](int x) {
std::cout << x << " ";
});
std::cout << std::endl;
// hardcore
// i know my lib
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
// boost lambda
// this is what google came up with
// using for the placeholder, otherwise this looks weird
using namespace boost::lambda;
std::for_each(v.begin(), v.end(), std::cout << _1 << " ");
std::cout << std::endl;
// fold
// i want to be a haskell programmer
std::accumulate(v.begin(), v.end(), std::ref(std::cout),
[](std::ostream& o, int i) -> std::ostream& { return o << i << " "; });
return 0;
}
在C++11中,如果你的编译器支持它,是的,它是。它被称为基于范围的 for。
std::vector<int> v;
// fill vector
for (const int& i : v) { std::cout << i << "\n"; }
它适用于 C 样式数组和任何具有函数并返回迭代器的类型。例:begin()
end()
class test {
int* array;
size_t size;
public:
test(size_t n) : array(new int[n]), size(n)
{
for (int i = 0; i < n; i++) { array[i] = i; }
}
~test() { delete [] array; }
int* begin() { return array; }
int* end() { return array + size; }
};
int main()
{
test T(10);
for (auto& i : T) {
std::cout << i; // prints 0123456789
}
}