一、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;
}