热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何设置一个整数的最小/最大值,其中`++`和`-`和一般数学服从你设置的限制,在c++中?

如何解决《如何设置一个整数的最小/最大值,其中`++`和`-`和一般数学服从你设置的限制,在c++中?》经验,为你挑选了1个好方法。

if我想知道一个用于设置整数限制的简洁方法,而不是在我的代码中丢失大量的语句,当迭代超过这些限制时,它仍然会包装它的值.

所以,例如,

int i(9998);
setMinMax(i,-27315, 10000); // Absolute Zero - Boiling Point of water
i++; // ==  9999
i++; // ==  10000
i++; // == -27315

如果最小 - 最大值可以是动态的,那将是理想的.我不介意制作新类型或运算符重载.我只是想避免做这样的事情:

int i = foo();
int j = bar();
int min(-27315);
int max(10000);
i += j;
     if (i==min-1) {i=max}
else if (i==max+1) {i=min}
else if (i>max) {i=min+(i-max)}
// more stupid code

谢谢.



1> alter igel..:

这可以完成,但不能用原始ints.您需要实现自己的类类型,该类型重载各种算术运算符,以便外观和感觉就像一个int.这是你可以实现这一目标的一种方法:

#include  // for numeric_limits

struct RangedInt {
private:
    int m_min = std::numeric_limits::min();
    int m_max = std::numeric_limits::max();
    int m_val = 0;
public:
    RangedInt(int value = 0) : m_val(value) {}

    void setMinMax(int min, int max){
        m_min = min;
        m_max = max;
        m_val = std::min(std::max(m_val, m_min), m_max);
    }

    // pre-increment
    RangedInt& operator++(){
        m_val++;
        if (m_val > m_max) m_val = m_min;
        return *this;
    }

    // post-increment
    RangedInt operator++(int){
        RangedInt tmp {*this}; // create temporary with old value
        operator++(); // perform increment
        return tmp; // return temporary
    }

    // pre-decrement
    RangedInt& operator--(){
        m_val--;
        if (m_val 

上面的代码现在允许您编写以下代码:

RangedInt i = 9998;
i.setMinMax(-27135, 10000);
std::cout <<(int)i <<'\n'; // 9998
i++;
std::cout <<(int)i <<'\n'; // 9999
i++;
std::cout <<(int)i <<'\n'; // 10000
i++;
std::cout <<(int)i <<'\n'; // -27135

此方法可以使用模板进行扩展,以适用于任何数字类型,而不仅仅是int,如果在编译时已知并且内存占用是一个问题,您还可以将最小值和最大值转换为模板参数.


推荐阅读
author-avatar
Annia000
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有