C++11:Range-Based for循環(基於範圍的循環)

一、Range-Based for循環概述

  • C++引入了一種嶄新的for循環形式,可以逐一迭代某個給定的區間、數組、集合內的每一個元素。類似於其他編程語言的foreach循環

二、基本格式

  • decl是給定的coll集合中的每個元素的聲明

三、基本使用

  • 例如:
int arr[]{ 1,2,3,4,5 };

for (int i : arr) {
    std::cout << i << " ";
}
  • 我們也可以initializer_list列表使用此種循環,本質上是調用initializer_list的begin()和end()進行遍歷
for (auto i : { 1,2,3,4,5 }) {
    std::cout << i << " ";
}
  • 我們可以獲取給定集合的引用,例如下面將數組中的每個元素乘以3:
int arr[]{ 1,2,3,4,5 };

for (auto& elem : arr) {
    elem *= 3;
}

四、對於類的使用

  • for循環對於vs進行遍歷,使用vs中的string元素構造C對象
class C {
public:
    C(const std::string& s) :elem(s) {}

    friend std::ostream& operator<<(std::ostream& out,const C& elem) {
        out << elem.elem;
        return out;
    }
private:
    std::string elem;
};

int main()
{
    std::vector<std::string> vs;
    vs.push_back("a");
    vs.push_back("b");

    //遍歷vs中的每一個元素構造一個C對象,返回的爲const類型的對象
    for (const C& elem : vs) {
        std::cout << elem << " ";
    }

    return 0;
}

  • 上面之所以能在for循環中構造C對象,使用到了C++中的類的隱式轉換構造函數,可以參閱:https://blog.csdn.net/qq_41453285/article/details/95192035
  • 如果類的構造函數爲explicit,那麼就不支持隱式轉換了,因此下面的代碼也就不能通過編譯了:
class C {
//其餘代碼同上
public:
    explicit C(std::string& s) :elem(s) {}
};

int main()
{
    //其餘代碼同上

    //錯誤的,C的構造函數爲explicit
    for (const C& elem : vs) {
        std::cout << elem << " ";
    }

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章