2016-05-02 17 views
0

Letzte große Hürde für dieses Projekt, und ich hoffe, Sie können mir helfen, weil ich wieder schrecklich fest bin. Woran ich arbeite, ist ein dynamisch zugewiesener Vorlagencontainer, bei dem der gesamte Code mit einem konstanten Iterator von Grund auf neu geschrieben wird, und ein zufälliger Iterator, der eine Permutation in Form eines Arrays von Indizes generiert. Bis jetzt habe ich es geschafft, die Indizes richtig zu generieren, aber ich bin unsicher, wie ich den Zufalls-Iterator dazu bringen kann, sich durch diese Indizes zu bewegen. Ich denke, es ist ein Problem mit meinem Operator ++ für den zufälligen Iterator, aber ich bin mir völlig unsicher, was ich tun soll, um es richtig zu iterieren. Hier sind einige Auszüge:Erstellen eines zufälligen Iterators (Permutation)

// Implementation of the rand_iterator method when provided a seed by 
// the user. rand_iterator takes a pointer to a container object, and the seed // as parameters. 
template <class T> 
typename sorted<T>::rand_iterator sorted<T>::rndbegin(unsigned seed){ 
    return rand_iterator(this, seed); 
} 

// Implementation of the const iterator pre-incrementer. 
template <class T> 
typename sorted<T>::const_iterator sorted<T>::const_iterator::operator++(){ ++m_current; return *this; } 


// This is what my rndbegin looks like at the moment. 
// Implementation of the rand_iterator rndbegin method. 
template <class T> 
typename sorted<T>::rand_iterator sorted<T>::rndbegin(){ 
    sorted<T>::rand_iterator newrand(this); 
    return newrand; 
} 

// Implementation of the non-default rand iterator constructor given 
// a user-defined seed. 
template <class T> 
sorted<T>::rand_iterator::rand_iterator(sorted<T>* srtdPtr, unsigned seed){ 

    int j; 
    m_rsize = srtdPtr->m_size; 

    // Set up the random seed. 
    // Allocate memory for m_random. 
    srand(seed); 
    m_random = new int[m_rsize]; 

    // Fill the randomized array with values. 
    for (int i = 0; i < srtdPtr->m_size; i++) 
    m_random[i] = i; 

    // Randomize the values. 
    for (int i = 0; i < srtdPtr->m_size; i++){ 

    T temp; 

    j = rand() % (srtdPtr->m_size); 
    temp = m_random[i]; 
    m_random[i] = m_random[j]; 
    m_random[j] = temp; 
    } 

    // Just testing to make sure the random array 
    // is set up properly; it is. 
    cout << "Random seed test:" << endl; 
    for (int i = 0; i < srtdPtr->m_size; i++) 
    cout << m_random[i] << " "; 
    cout << endl; 

    m_current = 0; 
    m_randPtr = srtdPtr; 
} 

// Implementation of the dereference operator. 
template <class T> 
const T& sorted<T>::rand_iterator::operator*(){ 
    return m_randPtr->m_data[m_random[m_current]]; 
} 

// Some code from main that's causing an issue. 
// ritr3 was already created and tested. 
sorted<int>::rand_iterator ritr5(ritr3); 

cout << "Printing copy constructed random index array - should print: 5 16 1 7 9 17 7 4 6" << endl; 
cout << "Actually prints: " << endl; 
for (ritr5 = x.rndbegin(4242); ritr5 != x.rndend(); ritr5++) 
    cout << *ritr5 << " "; 
cout << endl; 

Antwort

1

Let m_current sein der Index in m_crandom, und lassen Sie es 0-n ändern, dann m_crandom[m_current] wird der neu gemischt Index in das eigentliche Datenfeld sein.

Hier ist ein Beispiel der Grundidee zeigt:

http://coliru.stacked-crooked.com/a/47b28c0be0bcd027

+0

Vielen Dank für Ihre Hilfe! Ich bin mir nicht sicher, ob ich weiß, wie ich deinen Vorschlag umsetzen soll. – swingonaspiral

+0

Warte, sagst du, dass ich m_current ein int für die Klasse rand_iterator anstelle eines Zeigers machen soll und so, wenn es inkrementiert, kann ich es benutzen, um über das Array zu indizieren? Das macht Sinn, ich werde es versuchen. – swingonaspiral

+0

Ja, das habe ich gemeint. –

Verwandte Themen