如何对 class 参数中的字符串进行排序?

How do you sort a string within a class parameter?

我的教授要求我们制作一个程序,接受用户的输入并继续阅读直到输入结束。只有这样,程序才能输出用户输入的内容。

输入应基于视频标题,即 url、对视频的评论、时长(以分钟为单位)和评分(以 * 为单位)。

例如:

United Break Guitars, https://www.youtube.com/watch?v+5YGc4zOqozo, Great example of one person getting a giant company to listen, 4.5, ***, Space Versus Tabs, https://www.youtube.com/watch?v=SsoOG6ZeyUl, Decide for yourself: spaces or tabs?, 2.83, ****

在输入任何视频描述之前,用户需要指定三种选择的排序方式,Rating, Length, or title。我已经完成了教授要求的大部分代码和排序方法(冒泡排序),但是当我要求程序按标题排序时(这是三个选项中唯一一个字符串),它无法正确输出. 这是我的代码:

#include <iostream>
#include <stdlib.h>
#include <cstring>
using namespace std;

#include "video.h"


int main()
{
    string user, url, comment, title;
    int rating;
    double length;
    int i = 0, last = 0;

    Video *videoObj[100];


   // specifies how the videos should be sorted
   cin >> user;
   cin.ignore();


while (getline(cin,title)  ) {


    getline(cin, url);
    getline(cin, comment);
    cin >> length;
    cin >> rating;
    cin.ignore();



    videoObj[i] = new Video(title, url, comment, length, rating);
    i++;
    last++;
    }

//------------------------------------------------------------------------
//--------------- Sorts the list based on rating (*) ---------------------
//------------------------------------------------------------------------

    if(user=="rating"){

        for(int i = 0; i < last - 1; i++){

    for(int j = 0; j< last - i -1; j++){

    if(videoObj[j +1]->Rating(videoObj[j])){
            swap(videoObj[j], videoObj[j+1]);

      }
    }
  }
}

//------------------------------------------------------------------------
//--------------- Sorts the list based on length -------------------------
//------------------------------------------------------------------------

    if(user=="length"){

        for(int i = 0; i < last - 1; i++){

    for(int j = 0; j< last - i -1; j++){

    if(videoObj[j +1]->Length(videoObj[j])){
            swap(videoObj[j], videoObj[j+1]);


      }
    }
  }
}

//------------------------------------------------------------------------
//--------------- Sorts the list based on title --------------------------
//------------------------------------------------------------------------

 if(user=="title"){

        for(int i = 0; i < last - 1; i++){

    for(int j = 0; j< last - i -1; j++){

    if(videoObj[j +1]->Title(videoObj[j])){
            swap(videoObj[j], videoObj[j+1]);

      }
    }
  }
}


   for(int i= 0; i < last; i++){

    videoObj[i]->print();

   }

     //delete[] videoObj;

return 0;
}

video.cpp:

#include <iostream>
#include <algorithm>
using namespace std;

#include "video.h"

Video::Video(string video_title, string video_link, string video_comment, double video_length, int video_number)
: title(video_title), link(video_link), comment(video_comment), length(video_length), rating(video_number)
{
 m_title = title;
 m_link = link;
 m_comment = comment;
 m_length = length;
 m_rating = rating;
}


bool Video::Rating(Video *other)
{
    if(m_rating > other-> m_rating){
        return true;
    }
    else
    {
        return false;
    }
}


bool Video::Length(Video *other2)
{
     if(m_length > other2-> m_length){
        return true;
    }
    else
    {
        return false;
    }
}

bool Video::Title(Video *other3)
{
     if(m_length > other3-> m_length){
        return true;
    }
    else
    {
        return false;
    }
}

void Video::print(){

string star;
switch(rating){

case 1:
    star = "*";
    break;
case 2:
    star = "**";
    break;
case 3:
    star = "***";
    break;
case 4:
    star = "****";
    break;
case 5:
    star = "*****";
    break;

}

 cout << title << ", " << link << ", " << comment << ", " << length << ", " << star << endl;

}

video.h:

#ifndef VIDEO_H
#define VIDEO_H

using namespace std;

class Video {

public:
    Video(string video_title, string video_link, string video_comment, double video_length, int video_number);
    void print();
    bool Rating(Video *other);
    bool Length(Video *other2);
    bool Title(Video *other3);




private:


    string m_title;
    string m_link;
    string m_comment;
    double m_length;
    int m_rating;

    string title;
    string link;
    string comment;
    double length;
    int rating;

};


#endif

我不确定我需要对 title 做些什么才能使其正常运行。我正在考虑按字符串进行比较,但又不知道从哪里开始。

另外,还有一个问题,我如何使用 delete[] videoObj; 而不会出错?

嗯,这是错误的,可能只是一个错字

bool Video::Title(Video *other3)
{
     if(m_length > other3-> m_length){
        return true;
    }
    else
    {
        return false;
    }
}

应该是m_title不是m_length(大概)

bool Video::Title(Video *other3)
{
     if(m_title > other3-> m_title){
        return true;
    }
    else
    {
        return false;
    }
}

另外这段代码可以简化,上面可以写成一行

bool Video::Title(Video *other3)
{
    return m_title > other3-> m_title;
}

if (xxx) return true; else return false;return xxx; 完全相同。初学者通常没有意识到您可以用这种方式计算布尔值。