2012-11-29 6 views
0

J'ai l'exigence suivante.génération de nombre négatif cyclique en C++

Je dois générer des nombres négatifs incrémentaux de -1 à -100 qui est utilisé un identifiant unique pour une requête. Comme il devrait être comme ceci: -1, -2, -3, ...- 100, -1, -2, et ainsi de suite. Comment puis-je le faire efficacement? Je ne suis pas censé utiliser Boost. C++ STL est bien. Je préfère écrire une fonction simple comme int GetNextID() et il devrait générer un ID. Demander un exemple de programme sur la façon de le faire efficacement?

Merci pour votre temps et aider

Répondre

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

choses assez basique ici, vraiment. Si vous devez demander à quelqu'un sur Interwebs d'écrire ce programme pour vous, vous devriez vraiment envisager de trouver du matériel éducatif en C++.

+1

est-il énumérer de -1 à -100? –

+0

On dirait que ça ne va que de -1 à -99? –

+2

+1 juste parce que vous êtes le mal –

0

Même un problème simple comme celui-ci pourrait vous mener à plusieurs approximations, à la fois dans la solution algorithmique et dans l'utilisation concrète du langage de programmation.

C'était ma première solution utilisant C++ 03. J'ai préféré changer de signe après avoir calculé la valeur.

#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; 
} 

Une autre solution tenant compte du fait que le modulo entier en C++ prend le signe du dividende (!) Comme commenté dans le 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; 
} 
0

Quelque chose comme .... (havre de paix « t compilé)

class myClass 
{ 
    int number = 0; 
    int GetValue() 
    { 
     return - (number = ((number+1) % 101)) 
    } 
} 
2

J'aime la solution foncteur:

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

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

Ensuite, vous pouvez définir tout générateur avec une limite et de l'utiliser:

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

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

Vous pouvez également passer le générateur en tant que paramètre à une autre fonction, chaque funtor avec son propre état:

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); 

Si vous ne souhaitez pas la solution de modèle pour déclarer la limite, il y a aussi la version non-modèle:

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; 
}; 

En utilisant comme argument à une fonction fonctionne de la même manière, et il est l'état interne est transféré ainsi:

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

NegativeNumberNoTemplate notemplate(3); 
f(notemplate); 

J'espère que vous ne voulez pas l'utiliser avec filetage, ils sont pas thread-safe;

Here vous avez tous les exemples; J'espère que cela aide.