首頁 > 後端開發 > C++ > 為什麼基於範圍的 For 迴圈與 `std::vector` 的行為不同?

為什麼基於範圍的 For 迴圈與 `std::vector` 的行為不同?

DDD
發布: 2024-10-30 04:06:02
原創
1030 人瀏覽過

Why Do Range-Based For Loops Behave Differently with `std::vector`?

Range-for-Loops 和std::vector

在標準庫容器中使用基於範圍的for 循環時,迭代器的資料類型通常決定計數器變數的資料類型。然而,在 std::vector 的情況下,由於其底層儲存機制,會出現獨特的行為。

在第一個範例中:

<code class="cpp">std::vector<int> intVector(10);
for (auto& i : intVector)
    std::cout << i;
登入後複製

std::vector< ;int>包含整數,因此迭代器型別是 std::vector::iterator。此迭代器取消引用 T&,在本例中為 int&,使計數器變數的型別為 int&。

現在,讓我們考慮第二個範例:

<code class="cpp">std::vector<bool> boolVector(10);
for (auto& i : boolVector)
    std::cout << i;</code>
登入後複製

這裡是 std: :向量包含布林值,它們以整數壓縮格式儲存。迭代器類型是 std::vector::iterator,它取消引用 std::vector::reference,也稱為 std::_Bit_reference。此引用類型是右值(臨時),不能綁定到非常量引用。這會導致編譯錯誤:

<code class="text">invalid initialization of non-const reference of type ‘std::_Bit_reference&amp;’ from an rvalue of type ‘std::_Bit_iterator::reference {aka std::_Bit_reference}’</code>
登入後複製

解決方案是使用auto&&,如果它是左值引用,它將綁定到左值引用,或者如果它是臨時的,則創建右值的臨時副本:

<code class="cpp">for (auto&& i : boolVector)
    std::cout << i;</code>
登入後複製

透過此修改,程式碼將以預期輸出boolVector 的內容。

以上是為什麼基於範圍的 For 迴圈與 `std::vector` 的行為不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板