【发布时间】:2016-05-20 21:52:29
【问题描述】:
我很难解决这个问题。我想在我的多图(恰好是一个类的对象)中找到我的键的最大值和最小值。最大和最小我仅指我的对象大小成员。我已经制作了一个比较器函数,将它传递给 max_element(分别为 min_element)函数,但我遇到了一些错误——invalid initialization of type of reference of type 'const CFile&' from expression of type'std::对 '
我用自己实现的 min 和 max 函数解决了这个问题,但它对我来说似乎不合适。这就是为什么我想使用 min/max_element 算法......
这是我的示例程序::
class CFile {
string m_strFile;
unsigned int m_size;
public:
CFile () { m_strFile = ""; m_size = 0; }
CFile (string name, int size ) { m_strFile = name; m_size = size; }
string getFileName () const { return m_strFile; }
int getFileSize () const { return m_size; }
void setFileSize ( int size ) { m_size = size; }
/* stream manipulating and overloading operators here */
static bool Greater(const CFile& obj1, const CFile& obj2) {
return (obj1.getFileSize() > obj2.getFileSize());
}
bool operator< (CFile obj1, CFile obj2) {
return obj1.getFileName()<obj2.getFileName();
}
class CDirectory {
string m_strDirectory;
enum class Filetype {
Archive, Hidden, ReadOnly, System, FileNotSupported
};
Filetype filetype;
multimap <CFile, Filetype> m_DirectoryMap;
public:
friend std::ostream& operator<<(std::ostream& os, Filetype const type)
{
switch (type)
{
case Filetype::Archive:
os << "archive";
break;
case Filetype::Hidden:
os << "hidden";
break;
case Filetype::ReadOnly:
os << "read-only";
break;
case Filetype::System:
os << "system";
break;
case Filetype::FileNotSupported:
os << "not-supported";
break;
}
return os;
}
CDirectory (string n) {
fp.open (n, ios::in);
string dirName, fileName, fType;
int fileSize;
fp >> dirName;
m_strDirectory = dirName;
while (fp >> fileName >> fileSize >> fType) {
CFile obj (fileName, fileSize);
if (fType == "Archive")
filetype = Filetype::Archive;
else if (fType == "Hidden")
filetype = Filetype::Hidden;
else if (fType == "ReadOnly")
filetype = Filetype::ReadOnly;
else if (fType == "System")
filetype = Filetype::System;
else
filetype = Filetype::FileNotSupported;
m_DirectoryMap.insert(pair<CFile, Filetype>(CFile(obj.getFileName(), obj.getFileSize()), Filetype(filetype)));
}
multimap<CFile, Filetype>::iterator p = m_DirectoryMap.begin();
while ( p != m_DirectoryMap.end()) {
cout << endl << p->first.getFileName() << '\t' << p->first.getFileSize() << '\t' << p->second << endl;
++p;
}
}
void test() {
std::multimap<CFile, Filetype>::iterator result;
result = std::max_element(m_DirectoryMap.begin(), m_DirectoryMap.end(), Greater);
std::cout << "max element: " << result->first.GetFileSize() << "\t" << result->first.GetFileName();
}
};
int main () {
CDirectory obj("test.txt");
obj.test();
return 0;
}
【问题讨论】:
-
您能否将示例简化为minimal reproducible example?注意“最小”部分。文件输入、流操纵器等与您描述的问题几乎没有关系。
-
不相关的注释:为一个类定义两个(不一致的!)运算符
<(一个在命名空间范围内,一个在类中)是可怕的做法,并且等待灾难即将发生。摆脱其中一个(或两者,甚至;comapring files for ordering 是相当不直观的)。 -
谢谢,我会编辑我原来的帖子。我有全局运算符
<,因为(不知何故)如果我没有它,我似乎无法插入我的多映射对(来自我的第二类构造函数)。 -
如果您同时删除它们,则必须为地图提供合适的比较器。顺便说一句,课堂内
<的问题可能是它不是const,因此不能用于地图的键(即const)。 -
是的,这似乎是问题所在...我将其设为 const 并删除了全局变量 - 现在一切都很好。 :) 谢谢!
标签: c++ algorithm dictionary multimap