0

我有如下要求。

我必须生成从 -1 到 -100 的增量负数,该负数用作请求的唯一 ID。喜欢它应该是这样的:-1、-2、-3、...-100、-1、-2,等等。我怎样才能有效地做到这一点?我不应该使用Boost。C++ STL 很好。我更喜欢编写像 int GetNextID() 这样的简单函数,它应该生成 ID。请求示例程序如何有效地做到这一点?

感谢您的时间和帮助

4

4 回答 4

4
int ID = -1;
auto getnext = [=] mutable {
    if (ID == -100) ID = -1;
    return ID--;
};

这里相当基本的东西,真的。如果你不得不请 Internet 上的某个人为你编写这个程序,你真的应该考虑在 C++ 中找到一些教育材料。

于 2012-11-29T10:51:41.987 回答
2

我喜欢函子解决方案:

template <int limit> class NegativeNumber
{
public:
    NegativeNumber() : current(0) {};

    int operator()()
    {
        return -(1 + (current++ % limit));
    };
private:
    int current;
};

然后,您可以定义任何具有任何限制的生成器并使用它:

NegativeNumber<5> five;
NegativeNumber<2> two;

for (int x = 0; x < 20; ++x)
    std::cout << "limit five: " << five() << "\tlimit two: " << two() << '\n';

您还可以将生成器作为参数传递给另一个函数,每个函子都有自己的状态:

void f5(NegativeNumber<5> &n)
{
    std::cout << "limit five: " << n() << '\n';
}

void f2(NegativeNumber<2> &n)
{
    std::cout << "limit two: " << n() << '\n';
}

f5(five);
f2(two);

如果您不喜欢模板解决方案来声明限制,还有无模板版本:

class NegativeNumberNoTemplate
{
public:
    NegativeNumberNoTemplate(int limit) : m_limit(limit), current(0) {};

    int operator()()
    {
        return -(1 + (current++ % m_limit));
    };
private:
    const int m_limit;
    int current;
};

使用作为函数的参数以相同的方式工作,并且它的内部状态也被转移:

void f(NegativeNumberNoTemplate &n)
{
    std::cout << "no template: " << n() << '\n';
}

NegativeNumberNoTemplate notemplate(3);
f(notemplate);

我希望您不想将它与线程一起使用,它们不是线程安全的;)

这里有所有的例子;希望能帮助到你。

于 2012-11-29T11:27:00.863 回答
0

即使是这样一个简单的问题,也可能会导致您在算法解决方案和编程语言的具体使用中得出几个近似值。

这是我使用 C++03 的第一个解决方案。我更喜欢在计算值后切换符号。

#include <iostream>

int GetNextID() {
    // This variable is private to this function. Be careful of not calling it
    // from multiple threads!
    static int current_value = 0;

    const int MAX_CYCLE_VALUE = 100;

    return - (current_value++ % MAX_CYCLE_VALUE) - 1;
}

int main()
{
    const int TOTAL_GETS = 500;

    for (int i = 0; i < TOTAL_GETS; ++i)
        std::cout << GetNextID() << std::endl;
}

一种不同的解决方案,考虑到C++ 中的整数模采用被除数(!) 的符号,如Wikipedia中所述

#include <iostream>

int GetNextID() {
    // This variable is private to this function. Be careful of not calling it
    // from multiple threads!
    static int current_value = 0;

    const int MAX_CYCLE_VALUE = 10;

    return (current_value-- % MAX_CYCLE_VALUE) - 1;
}

int main()
{
    const int TOTAL_GETS = 50;

    for (int i = 0; i < TOTAL_GETS; ++i)
        std::cout << GetNextID() << std::endl;
}
于 2012-11-29T11:04:18.523 回答
0

像......(尚未编译)

class myClass
{
     int number = 0;
     int GetValue ()
     {
         return - (number = ((number+1) % 101))
     }
}
于 2012-11-29T11:12:21.610 回答