我正在使用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;
}
};
感谢您的帮助!永远赞赏。
答案 0 :(得分:2)
std::map
需要小于运算符的原因是因为它实现为红黑树。不仅如此,地图中的元素也保证有序。因此,它要求它作为键引用的类型可通过operator<
进行比较。
如果您不需要订购元素,那么您可以使用std::unordered_map
。但是,对于用户定义的类型,您必须明确定义并重载std::hash
。
只有一个操作符过载,它可以确定一个是否更大或者它们是否相等。
无论如何,您的代码的问题在于您尝试在主类之外创建小于运算符。将重载的operator<
移到Date
类的内部,它应该可以正常工作。