ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 基于范围的for循环和std :: vector:按顺序处理的元素是什么?

2019-08-25 12:09:13  阅读:261  来源: 互联网

标签:c c11 for-loop stdvector


我使用的是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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有