使用C++实现Range序列生成器
在C++编程中,经常需要迭代一系列数字或其他可迭代对象。通常,这需要编写复杂的循环结构,但有一种精妙的方法可以使这一过程变得更加简单和可读。如果你使用过Python语言那么一定对Range语句非常的数据,我们可以使用C++来实现一个简单的Range封装,如下代码定义了一个名为Range的命名空间,其中包含一个RangeImpl类和相关的函数,用于生成指定范围内的数值序列。这序列生成器支持指定开始值、结束值和可选步长,确保生成的序列满足指定的条件。此代码简化了迭代数值序列的过程,提高了代码的可读性和可维护性,适用于处理不同数据类型的序列。
首先读者需要新建一个Range.hpp头文件,并包含这个生成器代码。
namespace Range
{
template<typename value_t>
class RangeImpl
{
class Iterator;
public:
RangeImpl(value_t begin, value_t end, value_t step = 1) :m_begin(begin), m_end(end), m_step(step)
{
if (step>0 && m_begin >= m_end)
throw std::logic_error("end must greater than begin.");
else if (step<0 && m_begin <= m_end)
throw std::logic_error("end must less than begin.");
m_step_end = (m_end - m_begin) / m_step;
if (m_begin + m_step_end*m_step != m_end)
{
m_step_end++;
}
}
Iterator begin()
{
return Iterator(0, *this);
}
Iterator end()
{
return Iterator(m_step_end, *this);
}
value_t operator[](int s)
{
return m_begin + s*m_step;
}
int size()
{
return m_step_end;
}
private:
value_t m_begin;
value_t m_end;
value_t m_step;
int m_step_end;
class Iterator
{
public:
Iterator(int start, RangeImpl& range) : m_current_step(start), m_range(range)
{
m_current_value = m_range.m_begin + m_current_step*m_range.m_step;
}
value_t operator*() { return m_current_value; }
const Iterator* operator++()
{
m_current_value += m_range.m_step;
m_current_step++;
return this;
}
bool operator==(const Iterator& other)
{
return m_current_step == other.m_current_step;
}
bool operator!=(const Iterator& other)
{
return m_current_step != other.m_current_step;
}
const Iterator* operator--()
{
m_current_value -= m_range.m_step;
m_current_step--;
return this;
}
private:
value_t m_current_value;
int m_current_step;
RangeImpl& m_range;
};
};
template<typename T, typename V>
auto Range(T begin, T end, V stepsize)->RangeImpl<decltype(begin + end + stepsize)>
{
return RangeImpl<decltype(begin + end + stepsize)>(begin, end, stepsize);
}
template<typename T>
RangeImpl<T> Range(T begin, T end)
{
return RangeImpl<T>(begin, end, 1);
}
template<typename T>
RangeImpl<T> Range(T end)
{
return RangeImpl<T>(T(), end, 1);
}
}
当需要使用这个特殊的语句时,只需要直接引入到项目中,如下代码所示展示了如何在不同的情况下创建和迭代不同类型的数值序列,包括整数、浮点数和字符序列。以下是对每个循环的简要描述:
- 第一个循环使用Range::Range(15)创建一个整数序列,范围从0到14。
- 第二个循环使用Range::Range(2, 6)创建一个整数序列,范围从2到5。
- 第三个循环使用Range::Range(10.5, 15.5)创建一个浮点数序列,范围从10.5到15.5。
- 第四个循环使用Range::Range(35, 27, -1)创建一个递减的整数序列,范围从35到27。
- 第五个循环使用Range::Range(2, 8, 0.5)创建一个浮点数序列,范围从2到8,步长为0.5。
- 第六个循环使用Range::Range(8, 7, -0.1)创建一个浮点数序列,范围从8到7,步长为-0.1。
- 最后一个循循环使用Range::Range('a', 'z')创建一个字符序列,范围从'a'到'z'。
这个示例程序演示了如何使用 Range 序列生成器轻松生成不同类型的序列,无需编写复杂的循环结构,从而简化了代码编写过程。每个循环迭代并输出相应的序列元素,使读者能够更轻松地处理不同类型的数据。
#include <iostream>
#include "Range.hpp"
using namespace std;
int main(int argc, char* argv[])
{
for (int i : Range::Range(15))
{
std::cout << i << std::endl;
}
for (int i : Range::Range(2, 6))
{
std::cout << i << std::endl;
}
for (float i : Range::Range(10.5, 15.5))
{
std::cout << i << std::endl;
}
for (int i : Range::Range(35, 27, -1))
{
std::cout << i << std::endl;
}
for (float i : Range::Range(2, 8, 0.5))
{
std::cout << i << std::endl;
}
for (auto i : Range::Range(8, 7, -0.1))
{
std::cout << i << std::endl;
}
for (auto i : Range::Range('a', 'z'))
{
std::cout << i << std::endl;
}
std::system("pause");
return 0;
}
使用C++实现Range序列生成器的更多相关文章
- ALTER SEQUENCE - 更改一个序列生成器的定义
SYNOPSIS ALTER SEQUENCE name [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MA ...
- python3输出range序列
b=range(3) #输出的是[0, 1, 2] ,其实这里如果用在循环上,代表着循环多少次,这里是循环3次.从零开始.print(list(b))
- 美团Leaf——全局序列生成器
Leaf的Github地址: https://github.com/Meituan-Dianping/Leaf Leaf美团技术团队博客地址: https://tech.meituan.com/201 ...
- python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)
1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...
- Python之迭代器和生成器
Python 迭代器和生成器 迭代器 Python中的迭代器为类序列对象(sequence-like objects)提供了一个类序列的接口,迭代器不仅可以对序列对象(string.list.tupl ...
- Python进阶内容(四)--- 迭代器(Iterator)与生成器(Generator)
迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的ge ...
- Python 迭代器之列表解析与生成器
 [TOC] 1. 列表解析 1.1 列表解析基础 列表解析把任意一个表达式应用到一个迭代对象中的元素 Python内置ord函数会返回一个字符的ASCII整数编码(chr函数是它的逆过程, 它将A ...
- 为什么range不是迭代器?range到底是什么类型?
迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在.在关于迭代器的系列文章中(链接见文末),我至少提到了 23 种生成迭 ...
- Python基础之迭代器和生成器
阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...
- python学习------迭代器协议和生成器
一.递归和迭代 递归:自己调用自己 举例解释:问路 A问B康明网络科技怎么走,B说我不是很清楚,我帮你问问C,C说我也不知道.我问问D,D说 就在兴隆.之后D返回结果给C,C返回结果给B,B返回结 ...
随机推荐
- 用 Python 开发的 PDF 抽取Excel表格 2.0版
前些天向大家介绍了我开发的从PDF抽取表格小工具的使用方法(️点击直达),有同学反馈说有一些问题: 一页PDF有多张表,只能抽取第一个 有些表格线条是透明的,无法抽取 一页一页处理太麻烦,不能一次性抽 ...
- 【Redis】哈希类型 列表类型 集合类型 有序集合 慢查询 pipeline与事务 发布订阅 Bitmap位图 HyperLogLog
目录 昨日回顾 今日内容 1 哈希类型 2 列表类型 3 集合类型 4 有序集合(zset) 5 慢查询 6 pipeline与事务 7 发布订阅 8 Bitmap位图 9 HyperLogLog 作 ...
- 聊一聊数字孪生与3D可视化
前言 在当代科技发展的背景下,数字孪生和3D可视化技术逐渐成为各行业的关键工具和解决方案.数字孪生是一种将实物事物与数字模型相结合的概念,通过将物理世界和数字世界实时连接,创造出一个对实体进行虚拟建模 ...
- VSCODE配置tasks.json
1.新建配置任务tasks.json 选择gcc.exe 可以在其中按需修改 { "version": "2.0.0", "tasks": ...
- JS - HTML精确定位
scrollHeight: 获取对象的滚动高度. scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最 ...
- NodeJS安装指南(Mac)
nvm,node,npm之间的区别 nvm:nodejs 版本管理工具. 也就是说:一个 nvm 可以管理很多 node 版本和 npm 版本. nodejs:在项目开发时的所需要的代码库 npm:n ...
- 【水一篇】骚操作之net 6的winform启动的同时启动Net 6 WebApi【同一套代码】
引言 有段时间没有写博客了,不知道写什么,加上最近一直在玩单片机方面的东西,所以有一些懈怠.首先呢,为什么会有这么一个问题,是在一个QQ群里,有看到有人提问,能不能在启动Winform的同时去启动一个 ...
- [转帖]RocksDB 简介
https://docs.pingcap.com/zh/tidb/stable/rocksdb-overview RocksDB 是由 Facebook 基于 LevelDB 开发的一款提供键值存储与 ...
- [转帖]文件操作之zip、bzip2、gzip、tar命令
文件操作之zip.bzip2.gzip.tar命令 原创 丁同学19902015-10-15 00:02:51博主文章分类:liunx基础著作权 文章标签linux tarlinux文件压缩linux ...
- 【转帖】查看mysql库大小,表大小,索引大小
https://www.cnblogs.com/lukcyjane/p/3849354.html 说明: 通过MySQL的 information_schema 数据库,可查询数据库中每个表占用的空间 ...