2016-04-23 13 views
-11

Ich mag würde 2^n Variablen mit einem Stück Code erstellen, mit folgenden Eigenschaft:erstellen 2^n Variablen mit einem Muster

Wenn n = 1, sollten die Variablen n0 n1

benannt werden

Wenn n = 2, sollten die Variablen genannt werden n00 n01 n10 n11

Wenn n = 3, sollten die Variablen n000 n001benannt werdenn010 ..

Der maximale Wert von n ist begrenzt und kennt also keine Sorgen. Die Bits und damit die Variablen sollten in Folge sein.

Ich denke daran, ein Array von 2^n Elementen zu erstellen und dann 2^n Bits nacheinander zu bearbeiten und an n anzufügen. Dies scheint eine triviale und langwierige Lösung zu sein. Gibt es einen eleganteren Weg? C oder C++ geht mir gut.

+0

die Variablen sind Strings und "n0", "n1" ... sind ihre Werte? – user463035818

+1

Was ist der höchste Wert von n ?? –

+1

es ist nicht wirklich klar, was Sie fragen. Um "2^n Variablen" zu erzeugen, berechne x = 2^n und dann 'std :: vector vect = std :: vector (x);' die Variablen im Vektor werden im fortlaufenden Speicher gespeichert – user463035818

Antwort

1

Wenn Sie ein Stück Code erstellen zu müssen, dass viele verschiedene Variablen mit einem anderen Namen, schlage ich vor, Sie fangen an, Ihren eigenen Code-Generator zu schreiben. Der folgende Code sollte ein guter Anfang sein.

#include <sstream> 
#include <iostream> 
#include <string> 
#include <vector> 

namespace { 
template <typename Function> 
void bitExecutor(int nrOfBits, std::vector<bool> &bits, const Function &f) { 
    if (nrOfBits) { 
    bits.push_back(false); 
    bitExecutor(nrOfBits - 1, bits, f); 
    bits.back() = true; 
    bitExecutor(nrOfBits - 1, bits, f); 
    bits.pop_back(); 
    } else { 
    f(bits); 
    } 
} 
} 

int main(int argc, char **argv) { 
    int nrOfBits = 4; // Let's assume runtime init 

    std::vector<std::string> values; 
    std::vector<bool> bits; 
    bitExecutor(nrOfBits, bits, [&values](std::vector<bool> &bits) { 
    std::string buffer; 
    buffer += "n"; 
    for (auto &&bit : bits) { 
     if (bit) 
     buffer += "1"; 
     else 
     buffer += "0"; 
    } 
    values.emplace_back(std::move(buffer)); 
    }); 

    for (const auto &value : values) 
    std::cout << value << std::endl; 
    return 0; 
} 

Das sagte, ich denke, Sie versuchen, das falsche Problem hier anzugehen. Warum möchten Sie eine Menge Variablen haben, die dasselbe darstellen, während Sie Dinge wie std :: vector verwenden können, die vollständig mit der Indexierung arbeiten. Siehe auch die Variable 'Werte' in diesem Beispiel, die Sie wie values[0] // first element ... indizieren können und die passenden Werte erhalten

2

Es gibt keinen Grund, um manuell Hunderte oder Tausende von Variablen zu nennen, nur ein Array verwenden:

#include <stdlib.h> 

int main(int argc, char **argv) { 
     int n = 10; 
     /* static */ 
     int a[1<<n]; 

     /* dynamic */ 
     size_t bsize = 1<<n; /* 1024 */ 
     int *b = malloc(bsize * sizeof(int)); /* 1024 ints */ 

     return 0; 
} 
+1

'const statische automatische Größe = 1 << 10; std :: array a; 'wäre die C++ - Variante, in der Sie sich nicht um die Speicherverwaltung kümmern müssen. (statisch) oder 'std :: vector v; v.resize (size); '(dynamic) – JVApen

+0

@JVApen Prefer' conexpr' –

+0

Ich stimme zu, constexpr wäre sogar besser, obwohl ich es noch nicht richtig verwenden konnte. (VS2013 Beschränkung) – JVApen

Verwandte Themen