我需要以下C++語法的一些解釋:'冒號'和'自動'for循環C++?需要一些幫助理解語法
for(const auto& ioDev : deviceList)
因爲:
std::vector<Device *> deviceList
具體而言,我感到困惑「:」和「汽車的使用「?
我需要以下C++語法的一些解釋:'冒號'和'自動'for循環C++?需要一些幫助理解語法
for(const auto& ioDev : deviceList)
因爲:
std::vector<Device *> deviceList
具體而言,我感到困惑「:」和「汽車的使用「?
作爲您vector
在乍得,您的for循環迭代的答案所述,使用其begin
和end
迭代器。這是冒號:
語法的行爲。
關於你const auto &
語法:你應該想象來自哪個碼出來的:
// "i" is an iterator
const auto& ioDev = *i;
表達*i
爲(a參考)在容器中的元素的類型:Device *
。這是推斷的類型auto
。因爲你const &
附加到auto
,變量ioDev
是const
參考推導型(指針),就好像它是這樣聲明:
const Device *& ioDev = *i;
似乎不必要的複雜;如果你只需要正常的迭代(而不是如操縱指針的地址,我認爲這是極不可能的),使用普通的未修改auto
:
for (auto ioDev : deviceList)
或顯式類型:
for (Device* ioDev : deviceList)
這是一個基於for循環的範圍,它具有相同的基本行爲:基於循環很快就成爲我最喜歡的結構之一
for(auto it = deviceList.begin(); it != deviceList.end(); ++it)
{
const auto& ioDev = *it;
}
範圍,它的簡潔,當你需要遍歷的整個範圍內,儘可能(並且儘可能高效)地工作。
如果你需要一個典型的for循環的其他結構(說在某些情況下提前退出),然後基於範圍的不是該用例。
離開由於特定條件的範圍爲基礎的循環可以仍然很容易地通過使用'break'完成。恕我直言,在循環體的額外'if'聲明仍然比構建一個「傳統」的for循環與特定的停止條件乾淨多了。根據我的經驗,對於「傳統」for循環的需求大多數是在容器在循環體中發生變異時產生的。 – schlimmchen
「新」 for
循環簡單地在的deviceList
所有元素進行迭代。在循環體的每次迭代中,ioDev
是對deviceList
中的每個元素的連續引用。
至於ioDev
類型:它是Device *const &
類型的,因爲你可以在下面看到:
#include <vector>
#include <type_traits>
using namespace std;
int main()
{
vector<int *> v;
for(const auto &r: v)
{
static_assert(is_same<decltype(r), int *const &>::value, "wrong type");
}
}
谷歌「C++ auto」和「基於範圍」。 – emlai