Search code examples
c++stliterator

How do I convert from arrays to STL vectors?


In my class we recently got introduced to STL vectors. My professor has given us a program that uses arrays, and we are to convert it to use std::vectors instead. He would like us to use iterators, so we're not allowed to use square brackets, the push_back member function, or the at member function. Here's one of the for loops from the program I have to convert:

void readData(Highscore highScores[], int size)
{
    for(int index = 0; index < size; index++)
    {
        cout << "Enter the name for score #" << (index + 1) << ": ";
        cin.getline(highScores[index].name, MAX_NAME_SIZE, '\n');
        
        cout << "Enter the score for score #" << (index + 1) << ": ";
        cin >> highScores[index].score;
        cin.ignore();
    }
    cout << endl;
}
`

I'm just not quite understanding how to convert them. so far, I was kind of able to get this: for (vector <Highscore> :: iterator num = scores.begin(); num < scores.end(); num++)for the for loop. It doesn't quite make sense to me so I was hoping I can get some more tips or even more information on how to convert them. I don't want an answer, simply just a tip. Thank you! (if its of any help, this is the program I am having to convert and these are the four headers we have to use

void getVectorSize(int& size);
void readData(vector<Highscore>& scores);
void sortData(vector<Highscore>& scores);
vector<Highscore>::iterator findLocationOfLargest(
                                const vector<Highscore>::iterator startingLocation,
                                const vector<Highscore>::iterator endingLocation);
void displayData(const vector<Highscore>& scores);

above are the headers that have to be used (having to use these instead of the programs headers)

#include <iostream>
using namespace std;

const int MAX_NAME_SIZE = 24;

struct Highscore{
    char name[MAX_NAME_SIZE];
    int score;
};

void getArraySize(int& size);
void readData(Highscore highScores[], int size);
void sortData(Highscore highScores[], int size);
int findIndexOfLargest(const Highscore highScores[], int startingIndex, int size);
void displayData(const Highscore highScores[], int size);

int main()
{
    Highscore* highScores;
    int size;
    
    getArraySize(size);
    
    highScores = new Highscore[size];
    
    readData(highScores, size);
    sortData(highScores, size);
    displayData(highScores, size);
    
    delete [] highScores;
}



void getArraySize(int& size){
    cout << "How many scores will you enter?: ";
    cin >> size;
    cin.ignore();
}



void readData(Highscore highScores[], int size)
{
    for(int index = 0; index < size; index++)
    {
        cout << "Enter the name for score #" << (index + 1) << ": ";
        cin.getline(highScores[index].name, MAX_NAME_SIZE, '\n');
        
        cout << "Enter the score for score #" << (index + 1) << ": ";
        cin >> highScores[index].score;
        cin.ignore();
    }
    cout << endl;
}



void sortData(Highscore highScores[], int numItems) {
    for (int count = 0; count < numItems - 1; count++){
        swap(highScores[findIndexOfLargest(highScores, count, numItems)],
             highScores[count]);

    }
}



int findIndexOfLargest(const Highscore highScores[], int startingIndex, int numItems){
    int indexOfLargest = startingIndex;
    
    for (int count = startingIndex + 1; count < numItems; count++){
        if (highScores[count].score > highScores[indexOfLargest].score){
            indexOfLargest = count;
        }
    }
    return indexOfLargest;
}



void displayData(const Highscore highScores[], int size)
{
    cout << "Top Scorers: " << endl;
    for(int index = 0; index < size; index++)
    {
        cout << highScores[index].name << ": " << highScores[index].score << endl;
    }
}

Solution

  • Probably your professor wants you to write something like this:

    void readData(std::vector<Highscore>& highScores)
    {
        for (auto it = highScores.begin(); it != highScores.end(); ++it) {
            cout << "Enter the name for score #" << std::distance(highScores.begin(), it) << ": ";
            cin.getline(it->name, MAX_NAME_SIZE, '\n');
    
            cout << "Enter the score for score #" << std::distance(highScores.begin(), it) << ": ";
            cin >> it->score;
            cin.ignore();
        }
        cout << endl;
    }
    

    where it is the iterator that's incremented via ++it from highScores.begin() to just before highScores.end(); then you access the members of the highScores's element "pointed by" it via it->member.

    Here's a complete demo.


    By the way, considering how much your professor likes void(some_type&) functions (and using namespace std;, if that was not your own idea), I would doubt you have much to learn from him. You better buy a good book.