c – 基于范围的for循环和std :: vector:按顺序处理的元素是什么?
作者:互联网
我使用的是std :: vector,其中第一个元素是某种特殊的,并且需要与其他元素稍微不同的处理.
我想使用基于C 11范围的for循环以获得更多可读性,以下代码是否正确且在这种情况下的良好实践?
std::vector<T> v;
// [...] build v
bool isFirst = true;
for(auto element : v)
{
// [...] do lots of things common to all elements
if(isFirst)
{
// [...] do something that only applies to the first element
}
// [...] do lots of things common to all elements
isFirst = false;
}
从技术上讲,当使用带有std :: vector的基于范围的for循环时,是否保证按顺序处理元素,从v.front()到v.back()?
解决方法:
are elements guaranteed to be processed in order
是.
(for-range-declaration:expression)语句的基于范围的表格将被等效地评估为:[stmt.ranged] / 1
{
auto && __range = range-init;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}
如果range-init是(表达式)(在原始范围的冒号中使用冒号后的表达式),begin-expr基本上是begin(__ range),end-expr本质上是end(__ range).
is the following code correct and good practice in this situation?
我将提供一个替代而不是判断( – > Code Review):
template<class It>
struct range
{
It beg;
It en;
It begin() { return beg; }
It end() { return en; }
};
template<class It>
range<It> make_range(It beg, It en) { return {beg, en}; }
std::vector<int> v;
if(v.size() > 0)
{
auto r = make_range(begin(v)+1, end(v));
for(auto const& e : r)
{
// do.
}
}
标签:c,c11,for-loop,stdvector 来源: https://codeday.me/bug/20190825/1718602.html