0

以下のような要件があります。

リクエストの一意の ID として使用される -1 から -100 までの増分の負の数を生成する必要があります。-1、-2、-3、...-100、-1、-2 などのようになります。どうすればこれを効果的に行うことができますか?ブーストを使用することは想定されていません。C++ STL は問題ありません。私は int GetNextID() のような単純な関数を書くことを好み、ID を生成する必要があります。これを効果的に行う方法についてサンプル プログラムをリクエストしますか?

お時間をいただきありがとうございます。

4

4 に答える 4

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

ここにはかなり基本的なものがあります。Interwebs の誰かにこのプログラムの作成を依頼する必要がある場合は、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

のようなもの....(コンパイルされていません)

class myClass
{
     int number = 0;
     int GetValue ()
     {
         return - (number = ((number+1) % 101))
     }
}
于 2012-11-29T11:12:21.610 に答える
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++ の整数モジュロが被除数 (!) の符号を取ることを考慮した別のソリューション

#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 に答える