对一串罗马数字

时间:2017-03-27 22:22:19

标签: c++ string sorting roman-numerals

输入将是一串罗马数字,必须按其值排序。此任务也必须使用c ++中的类

完成

到目前为止,我已经创建了我的课程

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

class RomanNumbers
{
public:
    RomanNumbers(string = "");

    void setRoman(string);

    int convertToDecimal();

    void printDecimal();

    void printRoman();


private:

    string roman;

    int decimal;

};

将数字从罗马数字转换为整数形式的函数但我的问题是:我如何对它们进行排序,因为我无法创建一个包含转换后的罗马数字并对字符串进行排序的新字符串。任何帮助将不胜感激。

#include<iostream>
#include<string>
#include "RomanNumbers.h"
using namespace std;

RomanNumbers::RomanNumbers(string myRoman)
{
    roman = myRoman;
    decimal = 0;
}

void RomanNumbers::setRoman(string myRoman)
{
    roman = myRoman;
    decimal = 0;
}

int RomanNumbers::convertToDecimal()
{
    enum romans { I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000 };

    for (int i = 0; i < roman.size(); i++)
    {
        switch (roman[i])
        {

         case 'M': decimal += M; break;
         case 'D': decimal += D; break;
         case 'C': decimal += C; break;
         case 'L': decimal += L; break;
         case 'X': decimal += X; break;
         case 'V': decimal += V; break;

         case 'I':
             if (roman[i + 1] != 'I' && i + 1 != roman.size())
             {
                 decimal -= 1;
             }
             else
             {
                 decimal += 1;
             }
               break;

        }
    }

    return decimal;
}

void RomanNumbers::printRoman()
{
    cout << "Number in Roman form : " << roman;
    cout << endl;
}

void RomanNumbers::printDecimal()
{
    cout << "Number converted in integer form : " << decimal;

    cout << endl;
}

1 个答案:

答案 0 :(得分:4)

解决问题的一种方法是通过定义有意义的比较operator< /比较lambda表达式/比较类,然后将其与sort算法一起使用:

template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
例如,比较类将是:

struct RomanComp 
{
    bool operator() const (const RomanNumbers& lhs, const RomanNumbers& rhs)
    { 
        return lhs.decimal < rhs.decimal;
    }
} RomanComparator; // <--- note object instantiation

然后对罗马数字的矢量进行排序,例如,你可以:

std::vector<RomanNumbers> nums;

std::sort(nums.begin(), nums.end(), RomanComparator);

假设:

#include <algorithm>    // std::sort
#include <vector>       // std::vector