如果使用基于范围的 for 循环而不是标准的 for 循环,是否可以避免超出范围错误?
Can you avoid out of range error if you use range based for loop instead of the standard for loop?
我正在试验 基于范围的 for 循环,发现如果你使用基于范围的 for 循环循环遍历一个向量,它会遇到 out of range 错误 如果您使用 range-based for loop
,有什么方法可以避免此错误
int main()
{
vector<int> num{ 1,2,3,4,5 };
for (auto i : num)
{
cout << num[i] << endl;
}
}
显示此错误
与循环类型无关。您的循环查看向量 num
内的所有值 i
,然后打印 num[i]
。其中之一是 5
,因此它打印 num[5]
。但是 num
有 5 个元素,所以它们最多只能达到 num[4]
。超出范围。
template<class It>
struct indexer {
It it;
It operator*()const{return it;}
void operator++(){++it;}
void operator++(int){++it;}
bool operator==(indexer const& o)const{ return it == o.it; }
bool operator!=(indexer const& o)const{ return it != o.it; }
};
template<class It>
struct range {
It b,e;
It begin()const{return b;}
It end()const{return e;}
};
range<indexer<std::size_t>> counting( std::size_t begin, std::size_t end ) {
std::cout << begin << "->" << end << "\n";
return {{begin}, {end}};
}
template<class X>
auto indexes_of( X const& x ) {
using std::size;
return counting(0, size(x));
}
现在我可以让您的代码按照您的想法去做:
vector<int> num{ 1,2,3,4,5 };
for (auto i : indexes_of(num))
{
cout << num[i] << endl;
}
您的问题是将向量中的索引误认为是元素。 Range-for returns 个元素。 indexes_of
使它 return 成为相关容器的索引。
我正在试验 基于范围的 for 循环,发现如果你使用基于范围的 for 循环循环遍历一个向量,它会遇到 out of range 错误 如果您使用 range-based for loop
,有什么方法可以避免此错误int main()
{
vector<int> num{ 1,2,3,4,5 };
for (auto i : num)
{
cout << num[i] << endl;
}
}
显示此错误
与循环类型无关。您的循环查看向量 num
内的所有值 i
,然后打印 num[i]
。其中之一是 5
,因此它打印 num[5]
。但是 num
有 5 个元素,所以它们最多只能达到 num[4]
。超出范围。
template<class It>
struct indexer {
It it;
It operator*()const{return it;}
void operator++(){++it;}
void operator++(int){++it;}
bool operator==(indexer const& o)const{ return it == o.it; }
bool operator!=(indexer const& o)const{ return it != o.it; }
};
template<class It>
struct range {
It b,e;
It begin()const{return b;}
It end()const{return e;}
};
range<indexer<std::size_t>> counting( std::size_t begin, std::size_t end ) {
std::cout << begin << "->" << end << "\n";
return {{begin}, {end}};
}
template<class X>
auto indexes_of( X const& x ) {
using std::size;
return counting(0, size(x));
}
现在我可以让您的代码按照您的想法去做:
vector<int> num{ 1,2,3,4,5 };
for (auto i : indexes_of(num))
{
cout << num[i] << endl;
}
您的问题是将向量中的索引误认为是元素。 Range-for returns 个元素。 indexes_of
使它 return 成为相关容器的索引。