簡體   English   中英

c ++中基於范圍的for循環

[英]range-based for loops in c++

似乎C ++ 11中可用的“for each”語法允許在不知道數組的實際大小(元素數量)的情況下進行數組迭代。 我認為,因為它是新標准的一部分,即使對於C陣列,這也是非常安全的。 通常,在操作C數組之前,您還必須單獨知道C數組的大小,但我希望任何有這種新C ++技術經驗的人都可以驗證它是否與您期望的完全相同:

extern float bunch[100];

for (float &f : bunch) {
  f += someNumber;
}

對於這種技術,我應該知道哪些非明顯的副作用或缺點? 它在我看到的代碼中沒有顯示太多,可能是因為大多數代碼都是在標准之前編寫的。 想要確保它的罕見用法不是因為其他一些不為人知的原因。

這種用法沒有什么奇怪或不安全的。 數組的大小在編譯時是已知的,因此可以在循環中使用。 這是一個模板函數的示例,它允許您找出數組的長度:

template< class T, std::size_t N >
std::size_t length( const T (&)[N] )
{
  return N;
}

Foo f[5];
std::cout << length(f) << "\n";

這應該清楚地表明,您不能在動態大小的C風格數組上使用此技術或基於范圍的循環。

當然,如果你有基於范圍的循環,那么你也應該有std::array (如果沒有,你可以從std::tr1或boost得到ti),所以你可以完全避免使用C風格的數組:

extern std::array<float, 100> bunch;

for (auto &f : bunch) {
  f += someNumber;
}

使用帶陣列的基於范圍的for循環是完全安全的。 我想你擔心你可能會意外地在指針上使用它:

float* array = new float[100];
for (float& f : array) {
    // ...
}

不過不用擔心。 在這種情況下,編譯器將產生錯誤。 因此,在不安全的情況下,無論如何都會出現編譯錯誤。

數組可以作為引用傳遞,並推導出它們的類型和長度。

#include <iostream>

template<typename T, size_t N>
void fun(T const (&arr)[N])
{
    for (std::size_t i = 0; i < N; ++i)
       std::cout << arr[i] << " ";
}

int main()
{
   int x[] = { 1, 2, 3 }; // no need to set length here
   fun(x); // 1 2 3, no need to specify type and length here
}

暫無
暫無

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

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