为什么std :: map需要一个运算符<我该怎么写一个

时间:2018-03-24 03:14:52

标签: c++ stdmap

我正在使用std :: map库,我正在尝试将一堆数据放入地图中,我创建了一个地图来保存日期(time_t)和浮点数但是当我尝试添加它们时,我的编译器告诉我"错误:不匹配'运算符<' (操作数类型是const& date,const& date)"

我尝试创建一个重载的<操作员,但仍然给了我同样的错误。我还试图在这个程序之外创建一个地图,并且不需要运算符<那么我怎么写这个,为什么它甚至是必要的呢?

这是我在运行它的类:

class MutualFund
{
private:
    std::string ticker;
    Date oldestDate; //optional
    Date newestDate; // optional
    float newestNav; //optional
    map<Date,float> navHistory;
    set<Dividend> divHistory;
public:
    MutualFund(string i)
    {
    if( i == "VTSMX")
    {
    ifstream temp;
    string cell,cell2,tempstring;
    int i = 1;
    float tempFloat;
    temp.open("C:\\Users\\Lukas PC\\Desktop\\ass6files\\VTSMXshuffled.csv");
        //what needs to be done here:
        // turn the cell 1 into a Date object by turning it into a time_t
        //turn the cell2 into a float
        //populate the map
        while(!temp.eof())
        {
        // get the numbers from the spreadsheet
        getline(temp,cell,',');
        getline(temp,cell2,',');
        getline(temp,tempstring);

//make a time_t object from cell and put it into a Date object
        struct std::tm tm = {0};
        std::istringstream ss(cell.c_str());
        ss >> std::get_time(&tm, "%Y-%m-%d");
        //tm.tm_mday  = (tm.tm_mday -1);
        std::time_t time = mktime(&tm);
        Date mapDate;
        mapDate.setDate(time);


 //turn cell2 into a float
        if(isalpha(cell.at(1)) && isalpha(cell2.at(1)))
        {
        }
        else
        {
        cell2.erase(5,20);

        //cout << cell2<< endl;

        std::string::size_type sz;
        tempFloat = stof(cell2,&sz);
        navHistory[mapDate] = tempFloat;
        }
        i++;

        }
    }
    else if (i == "VFINX")
    {

    }
    }


   friend const bool operator< ( const Date &lhs ,const Date &rhs)
    {
        return true;
    }


};

感谢您的帮助!永远赞赏。

1 个答案:

答案 0 :(得分:2)

std::map需要小于运算符的原因是因为它实现为红黑树。不仅如此,地图中的元素也保证有序。因此,它要求它作为键引用的类型可通过operator<进行比较。

如果您不需要订购元素,那么您可以使用std::unordered_map。但是,对于用户定义的类型,您必须明确定义并重载std::hash

只有一个操作符过载,它可以确定一个是否更大或者它们是否相等。

无论如何,您的代码的问题在于您尝试在主类之外创建小于运算符。将重载的operator<移到Date类的内部,它应该可以正常工作。