簡體   English   中英

基於范圍的for循環和std :: vector:按順序處理的元素是什么?

[英]Range-based for loop and std::vector: are elements processed in order?

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

是保證按順序處理的元素

是。

一系列基於for形式的for ( for-range-declaration : expression ) statement將被等效地評價為:[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(expression) (在原始范圍的冒號中使用冒號后的表達式 ), begin-expr基本上是begin(__range)end-expr本質上是end(__range)


在這種情況下,以下代碼是否正確和良好實踐?

我會提供一個替代方案,而不是判斷( - > 代碼審查 ):

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.
    }
}

是的,當然它們是按順序處理的,否則它們的使用極其有限。 這是你可以做到的另一種方式。

std::vector<T> v;

// [...] build v

auto front = v.front();
/* do stuff to first */
for(auto iter = v.begin()+1; iter != v.end() ; ++iter) 
{
    //*iter is now the element incase you didn't know how iterators work
    // [...] do lots of things common to all elements
}  

這避免了作為第一個元素的所有檢查,並且不添加太多代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM