如何将数组转换为 STL 向量?

How do I convert from arrays to STL vectors?

在我的 class 中,我们最近介绍了 STL 向量。我的教授给了我们一个使用数组的程序,我们要将其转换为使用 std::vectors。他希望我们使用迭代器,所以我们不允许使用方括号、push_back 成员函数或 at 成员函数。这是我必须转换的程序中的 for 循环之一:

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

我只是不太了解如何转换它们。到目前为止,我有点能够得到这个:for (vector <Highscore> :: iterator num = scores.begin(); num < scores.end(); num++)for 循环。这对我来说不太有意义,所以我希望我能得到更多提示,甚至更多关于如何转换它们的信息。我不想要答案,只是一个小费。谢谢! (如果它有任何帮助,这是我正在使用 转换的程序,这些是我们必须使用的四个 headers

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

以上是必须使用的 headers(必须使用这些而不是程序 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;
    }
}

您可能正在寻找以下两件事之一。 如果你想在向量中添加一些东西,函数是push_back

vecScores.push_back(value) ; //in a for loop.

https://www.cplusplus.com/reference/vector/vector/push_back/

如果你想在地图上添加一些东西,你可以使用

的形式
mapScore[index]=value ; // in a for loop.

https://www.cplusplus.com/reference/map/map/operator[]/

我会这样做,也习惯输入std:: Why is "using namespace std;" considered bad practice?

还要小心signed/unsigned,要精确。 如果某些东西不能有负值,请使用无符号类型(或 size_t)

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

struct HighScore
{
    std::string name;
    unsigned int score;
};

// use size_t for sizes (value will always >0)
std::vector<HighScore> GetHighScores(size_t size)
{
    std::vector<HighScore> highScores;
    std::string points;

    for (size_t index = 0; index < size; index++)
    {
        HighScore score;
    
        std::cout << "Enter the name for score #" << (index + 1) << ": ";
        std::cin >> score.name;
            
        std::cout << "Enter the score for score #" << (index + 1) << ": ";
        std::cin >> points;

        // convert string to int
        score.score = static_cast<unsigned int>(std::atoi(points.c_str()));
    
        highScores.push_back(score);
    }
    std::cout << std::endl;

    return highScores;
}


int main()
{
    auto highScores = GetHighScores(3);
    return 1;
}

可能你的教授希望你写这样的东西:

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

其中 it 是通过 ++ithighScores.begin() 递增到 highScores.end() 之前的迭代器;然后您通过 it-><i>member</i> 访问 highScores 元素“指向”it 的成员。

Here's a complete demo.


顺便说一句,考虑到你的教授有多喜欢 void(some_type&) 函数(如果那不是你自己的想法,using namespace std;),我怀疑你能从他那里学到很多东西。你最好买一本好书。