当前位置: 首页 > news >正文

C++ 语言特性15 - 基于范围的for循环

1.  C++11的 for 循环

//C++11的for循环语法
for (declaration : range_expression) {// loop body
}//declaration:声明一个变量,该变量在每次迭代中被初始化为序列中的下一个值。
//range_expression:一个表达式,它返回一个迭代器范围,通常是容器或数组。//例子1
#include <vector>
#include <string>std::vector<std::string> fruits = {"apple", "banana", "cherry"};
for (const std::string& fruit : fruits) {std::cout << fruit << std::endl;
}//例子2
int myArray[] = {1, 2, 3, 4, 5};
for (int x : myArray) {std::cout << x << std::endl;
}//例子3 
#include <map>
#include <iostream>std::map<std::string, int> ages = {{"Alice", 30},{"Bob", 25},{"Charlie", 35}
};for (const auto& pair : ages) {std::cout << pair.first << " is " << pair.second << " years old." << std::endl;
}

2. C++ 20中的 for 循环

//C++20 
for ( init-statement for-range-declaration : for-range-expression ) {loop-statement;
}
//init-statement:在循环开始之前执行的语句,可以用于初始化变量或执行其他操作
//for-range-declaration:可以是变量声明,也可以是类型定义(C++20新特性)//例子1 
int total = 0;
for (auto n = 10; auto x : std::vector<int>{1, 2, 3, 4, 5}) {total += x * n;
}
std::cout << "Total: " << total << std::endl; // 输出 Total: 70//例子2
//**********************************************************
#include <iostream>
#include <vector>
#include <string>
#include <map>int main() {std::vector<int> v = {1, 2, 3, 4, 5};for (auto x : v) {std::cout << x << " ";}std::cout << "\n";std::map<std::string, int> m = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};for (const auto& [name, age] : m) {std::cout << name << ": " << age << "\n";}for (auto n = 3; auto i : std::vector<int>{0, 1, 2, 3}) {std::cout << n * i << " ";}std::cout << "\n";for (using elem_t = int; elem_t i : std::vector<elem_t>{1, 2, 3}) {std::cout << i << " ";}std::cout << "\n";return 0;
}

3. 如何在自定义类中支持基于范围的for循环 

        为了在自定义类中支持基于范围的 for 循环,需要确保自定义类可以被迭代。这通常意味着需要提供 begin()end() 方法,这样标准库的 std::beginstd::end 就可以使用这些方法来获取迭代器。

  1. 定义迭代器:为自定义类定义一个迭代器,这个迭代器至少需要支持 ++*!= 操作。

  2. 提供 begin()end() 方法:在自定义类中提供 begin()end() 方法,它们分别返回指向第一个元素和末尾的迭代器。

  3. (可选)支持 const 迭代器:如果希望自定义类在 const 上下文中也能被迭代,应该提供 const 版本的 begin()end() 方法。

#include <iostream>
#include <vector>class MyRange {
private:std::vector<int> data_;public:// 构造函数MyRange(std::initializer_list<int> list) : data_(list) {}// 返回到开始的迭代器auto begin() {return data_.begin();}// 返回到结束的迭代器auto end() {return data_.end();}// const 迭代器版本auto begin() const {return data_.begin();}auto end() const {return data_.end();}
};int main() {MyRange range({1, 2, 3, 4, 5});// 使用基于范围的for循环for (const int& value : range) {std::cout << value << " ";}std::cout << std::endl;return 0;
}


http://www.mrgr.cn/news/42367.html

相关文章:

  • 项目管理-采购管理
  • 实景三维技术对光伏产业的发展具有哪些优势?
  • Kafka的基本概念整理
  • Java继承、final/protected说明、super/this辨析
  • 炒股基本功有多重要,炒股基本功真能决定投资成败吗
  • JAVA就业笔记1——第一阶段(1)
  • Tacotron:[Tacotron: A Fully End-To-End Text-To-Speech Synthesis Model]
  • protobuf 讲解
  • 螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习03(网络及IP规划)
  • 使用 Python 模拟蒙特卡洛实验
  • python泵站设备运行预警信息管理系统
  • 虾皮Shopee大数据面试题及参考答案
  • Java第二阶段---10方法带参---第二节 方法重载(Overloading)
  • 通信协议的选择:UART、SPI、I2C与CAN的比较
  • 各省-城镇化率(2001-2022年)
  • CSP-X复赛基础框架
  • 大数据分析案例-基于逻辑回归算法构建抑郁非抑郁推文识别模型
  • C++——输入一个2*3的矩阵, 将这个矩阵向左旋转90度后输出。(要求:使用指针完成。)
  • list的模拟实现
  • 实现TCP Connect的断线重连机制:策略与实践