6 Stimmen

Füllen Sie das int-Array von Null bis zu einer bestimmten Zahl auf

Ich muss das int[]-Array in C++ von Null bis zu einer durch eine Variable definierten Zahl ausfüllen, aber ISO C++ verbietet Arrays mit variabler Länge... Wie kann ich das Array einfach ausfüllen? Muss ich den Speicher zuweisen/freigeben?

int possibilities[SIZE];
unsigned int i = 0;
for (i = 0; i < SIZE; i++) {
    possibilities[i] = i;
}

btw. wenn Sie fragen würden - Ja, ich brauche genau Standard int[] Arrays, keine Vektoren, keine Karten usw.

32voto

jarno Punkte 271

In C++11 können Sie std::iota und std::array verwenden. Das folgende Beispiel füllt ein Array der Größe 10 mit Werten von 1 bis 10.

std::array<int, 10> a;
std::iota(a.begin(), a.end(), 1);

bearbeiten Natürlich funktioniert std::iota auch mit Vektoren.

16voto

Oliver Charlesworth Punkte 259497

Wie Sie festgestellt haben, können Sie kein Array mit variabler Länge auf dem Stack erstellen. Sie haben also die Wahl, es entweder auf dem Heap zu allozieren (was Probleme mit der Speicherverwaltung mit sich bringt) oder eine std::vector anstelle eines Arrays im C-Stil:

std::vector<int> possibilities(SIZE);
for (int i = 0; i < SIZE; i++)
{
    possibilities[i] = i;
}

Wenn Sie es noch auffälliger haben wollen, können Sie STL verwenden, um diese Sequenz für Sie zu erzeugen:

// This is a "functor", a class object that acts like a function with state
class IncrementingSequence
{
public:
    // Constructor, just set counter to 0
    IncrementingSequence() : i_(0) {}
    // Return an incrementing number
    int operator() () { return i_++; }
private:
    int i_;
}

std::vector<int> possibilities(SIZE);
// This calls IncrementingSequence::operator() for each element in the vector,
// and assigns the result to the element
std::generate(possibilities.begin(), possibilities.end(), IncrementingSequence);

3voto

kalaxy Punkte 1528

Wenn Sie Zugang zu boost haben, dann haben Sie bereits Zugang zu einem inkrementierenden Iterator.

#include <vector>
#include <boost/iterator/counting_iterator.hpp>

std::vector<int> possibilities(
    boost::counting_iterator<int>(0),
    boost::counting_iterator<int>(SIZE));

Le site Zähl-Iterator umschließt im Wesentlichen das Erhöhen eines Wertes. So können Sie automatisch sagen, es die Anfangs-und Endwerte und Vektor wird sich selbst richtig aufzufüllen.

Wie bereits erwähnt, kann der resultierende Vektor direkt mit std::next_permutation verwendet werden.

std::next_permutation(possibilities.begin(),possibilities.end());

2voto

UmmaGumma Punkte 5753
std::vector<int> possibilities;
unsigned int i = 0;
for (i = 0; i < SIZE; i++) {
    possibilities.push_back(i);
}

Verwenden Sie std::vector (Sie müssen Folgendes angeben <vector> )

Wenn Sie den Vektor an std::next_permutation müssen Sie schreiben:

std::next_permutation(possibilities.begin(),possibilities.end());

Sie können Vektoren auch als Arrays im C-Stil verwenden. &vec[0] gibt einen Zeiger auf ein Array im C-Stil zurück.

1voto

xtofl Punkte 39285

Sie können die std::generate_n Funktion:

std::generate_n( myarray, SIZE, increment() );

Wo increment ist ein Objekt, das Zahlen erzeugt:

struct increment {
 int value;
 int operator() () { return ++value; }
 increment():value(0){}
};

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X