欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > [原创](Modern C++)现代C++的关键性概念: 非常独特的std::sentinel_for概念(哨兵概念)

[原创](Modern C++)现代C++的关键性概念: 非常独特的std::sentinel_for概念(哨兵概念)

2025/3/10 10:21:14 来源:https://blog.csdn.net/Code_GodFather/article/details/146121405  浏览:    关键词:[原创](Modern C++)现代C++的关键性概念: 非常独特的std::sentinel_for概念(哨兵概念)

[作者]
常用网名: 猪头三
出生日期: 1981.XX.XX
企鹅交流: 643439947
个人网站: 80x86汇编小站
编程生涯: 2001年~至今[共24年]
职业生涯: 22年
开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、
开发工具: Visual Studio、Delphi、XCode、C++ Builder、Eclipse
技能种类: 逆向 驱动 磁盘 文件 大数据分析
涉及领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 股票模型量化/磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测
专注研究: 机器学习、股票模型量化、金融分析

[序言]
在C++20中, 范围库为带来了更加灵活和高效的数据处理方式, 而std::sentinel_for概念正是其中一个重要且独特的创新点. 传统的迭代器对(即begin和end迭代器)需要同时给定起始位置和结束位置, 在某些场景下显得不够灵活, 尤其是在迭代的结束条件并非固定位置, 而是由某个动态条件决定时. 例如, 可能希望在遇到特定值(如换行符\n)时停止迭代, 而不是遍历整个容器. 在这种情况下, C++20的std::sentinel_for概念(即哨兵概念), 提供了一种全新的解决方案.

[哨兵的特性]
哨兵(Sentinel)是一个与迭代器搭配使用的特殊对象, 它的作用是定义迭代的终止条件. 与传统固定的end迭代器不同, 哨兵允许根据实际需求自定义结束逻辑, 从而极大地增强了迭代器的表达能力.

[代码演示]

#include <iostream>
#include <ranges>
#include <io.h>
#include <fcntl.h>// 哨兵类: 用于判断迭代是否满足结束条件
template<class Iter>
class Sentinel {
public:using value_type = std::iter_value_t<Iter>;// 构造函数: 指定结束值Sentinel(value_type param_end_value) : mpr_iv_End{param_end_value} {}// 默认构造函数: 初始化为0Sentinel() : mpr_iv_End{0} {}// 定义比较运算符 == 和 !=, 支持两种参数顺序friend bool operator==(const Iter& param_it, const Sentinel& param_s) {return *param_it == param_s.mpr_iv_End;}friend bool operator==(const Sentinel& param_s, const Iter& param_it) {return *param_it == param_s.mpr_iv_End;}friend bool operator!=(const Iter& param_it, const Sentinel& param_s) {return !(*param_it == param_s.mpr_iv_End);}friend bool operator!=(const Sentinel& param_s, const Iter& param_it) {return !(*param_it == param_s.mpr_iv_End);}private:value_type mpr_iv_End; // 存储结束条件值
};int main() {// 设置输出模式为宽字符_setmode(_fileno(stdout), _O_WTEXT);// 示例: 使用哨兵确定迭代范围, 结束条件为遇到第一个'\n'// 预期输出: Hello, World!const wchar_t wchar_Demo[] = L"Hello, World!\nBye for now\n";std::ranges::for_each(wchar_Demo, Sentinel<const wchar_t*>(L'\n'), [](const wchar_t param_Input) {std::wcout << param_Input;});std::cin.get(); // 暂停以查看输出return 0;
}

[代码说明]
在这段代码中, 实现了一个基于哨兵的迭代控制机制, 具体说明如下:
1. 哨兵类的定义:
   * 定义了一个模板类Sentinel<Iter>, 其中Iter是迭代器的类型. 通过std::iter_value_t<Iter>推导出迭代器指向的元素类型value_type.
   * 哨兵类持有一个私有成员mpr_iv_End, 用于存储结束条件的值(如示例中的\n). 构造函数允许用户传入自定义的结束值, 默认构造函数则将其初始化为0.
   * 通过友元函数operator==和operator!=, 定义了迭代器与哨兵之间的比较逻辑. 当迭代器指向的元素等于mpr_iv_End时, 迭代停止.

2. 主函数中的使用:
   * 定义了一个宽字符数组wchar_Demo, 内容为"Hello, World!\nBye for now\n". 目标是只输出第一行(即遇到第一个\n时停止).
   * 使用C++20的std::ranges::for_each, 传入起始迭代器wchar_Demo(指向数组开头)和哨兵Sentinel<const wchar_t*>(L'\n'). 第三个参数是一个lambda函数, 用于输出当前字符.
   * 当迭代器遇到\n时, operator==返回true, std::ranges::for_each停止迭代, 最终输出"Hello, World!"

3. 运行机制:
   * std::ranges::for_each会从wchar_Demo开始逐个访问元素, 并与哨兵进行比较. 当迭代器指向的字符等于哨兵中的\n时, 迭代终止. 这种机制使得无需显式指定结束迭代器, 而是通过动态条件控制范围.

[总结]
std::sentinel_for概念是现代C++中一项创新且强大的特性, 它扩展了传统迭代器模型的局限性. 通过哨兵, 可以轻松定义自定义的迭代结束条件. 在运行时动态决定结束条件, 处理流式数据、不定长输入或复杂逻辑时尤为有用. 此外, C++20的ranges库与哨兵概念无缝集成, 进一步提升了代码的可读性和通用性.

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词