Как использовать сортировку выделения по строковому вектору объектов - PullRequest
0 голосов
/ 05 апреля 2020

Я довольно новичок в кодировании, и многие вещи для меня довольно чужды. Я пишу программу на С ++, которая должна взять список песен из текстового файла и иметь возможность перемешивать, сортировать и искать песню в списке. На данный момент я только начал сортировку, но у меня возникают проблемы с поиском того, как отформатировать алгоритм для работы с моим вектором песен.

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstdlib>
#include <time.h>
#include <stdlib.h>

#include <bits/stdc++.h>
#include <algorithm>

#include "song.h"

using namespace std;

// given to you
void processFile(vector<Song> &playlist);

// you should create
void shuffle(vector<Song> &playlist);
void bubbleSort(vector<Song> &playlist);
void displayPlaylist(vector<Song> playlist);
int binarySearch(vector<Song> &playlist, string songTitle);



int main()
{
    vector<Song> playlist;

    // sets up playlist
    processFile(playlist);

    cout << "\nInitial playlist: " << endl;

    //displayPlaylist(playlist);
    displayPlaylist(playlist);

    cout << "Welcome to the playlist display manager." << endl << endl;

    while(1)
    {
        int option;

        cout << "0. Exit" << endl;
        cout << "1. Sort Playlist" << endl;
        cout << "2. Shuffle Playlist" << endl;
        cout << "3. Search Playlist" << endl;
        cout << "Which option would you like" << endl;
        cin >> option;

        if(option == 0)
        {
            break;
        }

        else if(option == 1)
        {
            bubbleSort(playlist);
            displayPlaylist(playlist);

        }

        else if(option == 2)
        {

        }

        else if(option == 3)
        {


        }

        else
        {
           cout << "invalid response...try again" << endl;
        }
    }

    return 0;
}

void processFile(vector<Song> &playlist)
{
    ifstream infile;
    string line;

    infile.open("songs.txt");

    if(infile.is_open())
    {
        cout << "Successful songs opening." << endl;

    }

    else
    {
        cout << "Couldn't locate file. Program closing." << endl;
        exit(EXIT_FAILURE);
    }

    while(getline(infile, line))
    {
        // first line --> song
        // second line --> artist

        if(line != "")
        {
            string song, artist;

            song = line;

            getline(infile, artist);

            Song temp(song, artist);

            playlist.push_back(temp);
        }
    }

    return;
}

void shuffle(vector<Song> &playlist)
{

}


void selectionSort(vector<Song> &playlist, int n)
{

}

void bubbleSort(vector<Song>& playlist)
{
    int size;
        size = playlist.size();
        for(int i= 0; i < size - 1; i++)
        {
            int smallIndex = i;
            for(int j = i + 1; j < size; j++)
            {
                if(&playlist[j] < &playlist[smallIndex])
                {
                    smallIndex = j;
                }
            }
            string song, artist;

            Song temp(song, artist);
            temp = playlist[i];

            playlist[i] = playlist[smallIndex];
            playlist[smallIndex] = temp;
}
}
//display songs
void displayPlaylist(vector<Song> playlist)
{
    for(int i = 0; i < playlist.size(); i++)
    {
        cout << playlist[i].getTitle() << " - " << playlist[i].getArtist() << endl;


    }


}

Вот то, что я имею до сих пор. Я должен использовать функцию для сортировки песен. Вектор использует класс, который был мне предоставлен, чтобы помочь классифицировать строку песен в текстовом файле по песне, а затем по исполнителю (название - это первое, что указано в строке), и я должен сортировать по названию. Это только последний алгоритм, который я попробовал. Я не обязан использовать сортировку выбора. Всякий раз, когда я вызываю функцию и пытаюсь отобразить список, он получается одинаковым.

edit: Извините, просто получилось, что я, вероятно, должен go опередить и показать весь свой код, даже если это не было сделано.

1 Ответ

0 голосов
/ 05 апреля 2020

Ваш алгоритм сортировки почти верен с небольшой ошибкой. Вам нужно отбросить & в , если условие вашего вложенного l oop, ваш внутренний l oop должен быть следующим:

        for(int j = i + 1; j < size; j++)
        {
            if(playlist[j] < playlist[smallIndex])
            {
                smallIndex = j;
            }
        }

Хотя это, как говорится, Поскольку список воспроизведения является вектором объектов Song, и вы используете оператор < для этих объектов, вам потребуется перегрузить оператор меньше чем < для вашего класса. С другой стороны, если вам нужно выполнить сортировку по названию песни или имени исполнителя, и они являются хорошо определенными объектами C ++ (поскольку большинство объектов библиотеки C ++ уже определили оператор меньше чем для них). Например, если название песни или имя исполнителя являются строками, и вам нужно отсортировать, скажем, по названию песни, то вы можете сделать это следующим образом:

if(playlist[j].song_name < playlist[smallIndex].song_name)

Здесь вам не нужно ставить префикс переменная амперсандом &, вы можете запутаться из-за использования амперсанда с переменной playlist в списке параметров функции. Что ж, амперсанд должен сказать компилятору передать переменную в качестве ссылки. Для получения дополнительной информации о ссылочных переменных прочитайте следующие ссылки: Что такое ссылочная переменная в C ++ и Справочные переменные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...