首頁 > 後端開發 > C++ > 主體

基於範圍的迭代如何與 C 中的標準映射配合使用以及不同版本之間的語法有何不同?

Mary-Kate Olsen
發布: 2024-10-30 02:49:28
原創
979 人瀏覽過

How does range-based iteration work with standard maps in C   and how does the syntax differ across versions?

標準映射的基於範圍的迭代

在C 11 及更高版本中,基於範圍的for() 循環提供了一種方便的迭代語法通過容器。然而,它們在映射等複雜資料結構中的行為可能會令人困惑。

考慮以下範例:

<code class="cpp">std::map<foo, bar> testing = /*...initialized...*/;
for (auto abc : testing) {
  std::cout << abc << std::endl;
}</code>
登入後複製

此循環中 abc 的類型為何?它會產生 foo 鍵、bar 值還是迭代器?

解析度

在 C 11 和 C 14 中,基於範圍的循環迭代映射的鍵-值對。因此 abc 的型別是 std::pair。這意味著每個元素代表一個鍵值對,而不是單一鍵或值。

要單獨檢索鍵和值,您可以使用該對的第一個和第二個成員:

<code class="cpp">for (auto abc : testing) {
  std::cout << abc.first << " has value " << abc.second << std::endl;
}</code>
登入後複製

請注意,循環中的變數通常被宣告為const,以表示它們不會修改地圖的內容。

C 17 及以上

In C 17 中,為基於範圍的映射迭代引入了一種方便的簡寫符號:

<code class="cpp">for (const auto& [key, value] : testing) {
  std::cout << key << " has value " << value << std::endl;
}</code>
登入後複製

此語法直接用鍵和值取代第一個和第二個成員。這允許對鍵值對進行更清晰、更簡潔的迭代表達。

其他注意事項

  • 可以在循環內修改地圖的內容使用聲明為auto& 的引用變數:
<code class="cpp">for (auto& kv : testing) {
  std::cout << kv.first << " had value " << kv.second << std::endl;
  kv.second = "modified";  // Modifies the map's value
}</code>
登入後複製
  • 如果映射的值很大,則使用帶有迭代器的基於範圍的循環而不是對物件可能會更有效。然而,這消除了基於範圍的 for 迴圈提供的一些便利。

以上是基於範圍的迭代如何與 C 中的標準映射配合使用以及不同版本之間的語法有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!