使用C++11的基于范围的for
的正确方法是什么
应该使用什么语法?for (auto elem : container)
、for (auto& elem : container)
还是for (const auto& elem : container)
?还是其他的?
发布于 2013-04-11 03:35:24
正确的方法总是
for(auto&& elem : container)
这将保证所有语义的保留。
发布于 2017-12-12 15:10:21
虽然range-for循环的最初动机可能是易于迭代容器的元素,但其语法足够通用,即使对于不是纯粹容器的对象也是有用的。
for循环的语法要求是range_expression
支持begin()
和end()
作为函数--或者作为它计算的类型的成员函数,或者作为接受该类型实例的非成员函数。
作为一个人为设计的示例,您可以生成一个数字范围,并使用以下类在该范围内迭代。
struct Range
{
struct Iterator
{
Iterator(int v, int s) : val(v), step(s) {}
int operator*() const
{
return val;
}
Iterator& operator++()
{
val += step;
return *this;
}
bool operator!=(Iterator const& rhs) const
{
return (this->val < rhs.val);
}
int val;
int step;
};
Range(int l, int h, int s=1) : low(l), high(h), step(s) {}
Iterator begin() const
{
return Iterator(low, step);
}
Iterator end() const
{
return Iterator(high, 1);
}
int low, high, step;
};
使用下面的main
函数,
#include <iostream>
int main()
{
Range r1(1, 10);
for ( auto item : r1 )
{
std::cout << item << " ";
}
std::cout << std::endl;
Range r2(1, 20, 2);
for ( auto item : r2 )
{
std::cout << item << " ";
}
std::cout << std::endl;
Range r3(1, 20, 3);
for ( auto item : r3 )
{
std::cout << item << " ";
}
std::cout << std::endl;
}
将会得到以下输出。
1 2 3 4 5 6 7 8 9
1 3 5 7 9 11 13 15 17 19
1 4 7 10 13 16 19
https://stackoverflow.com/questions/15927033
复制相似问题