【发布时间】:2016-02-09 20:25:09
【问题描述】:
我有这个程序,我将成对的类对象 + 枚举放在一个多映射中。类对象有一个成员类型 int 文件大小。我想在我的多重映射中找到最大和最小的键。
我通过创建 3 个迭代器来做到这一点,将每个对象与下一个对象进行比较,如果它更小(或更大,取决于我搜索的内容),它将被分配给第三个迭代器。之后,我只打印出第三个迭代器。有没有其他优雅的方式来做到这一点?我知道这行得通,但我确信还有另一种方法 - 我似乎找不到它。
这是我的最大文件功能:
void getMaxFile() {
multimap<CFile, Filetype>::iterator p = m_DirectoryMap.begin();
multimap<CFile, Filetype>::iterator t = m_DirectoryMap.begin();
multimap<CFile, Filetype>::iterator x = m_DirectoryMap.begin();
t++;
while (p != m_DirectoryMap.end()) {
if (p->first.getFileSize() > t->first.getFileSize())
x = p;
++p, ++t;
}
cout << "The largest file is: " << endl << x->first.getFileName()
<< '\t' << x->first.getFileSize() << '\t' << x->second << endl;
}
第二个类的构造函数,我在其中制作多映射并用另一对类对象 + 枚举(从文件中读取)填充它:
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;
}
}
还有第一类(哪些对象是我的多重地图中的关键):
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; }
bool operator< (CFile& obj) {
return ( m_size < obj.m_size );
}
bool operator== (const CFile& obj) {
return ( m_size == obj.m_size );
}
friend ostream& operator<< ( ostream& ost, const CFile& obj ) {
return ost << obj.m_strFile << obj.m_size;
}
friend istream& operator>> ( istream& ist, CFile& obj ) {
return ist >> obj.m_strFile >> obj.m_size;
}
static bool Greater(const CFile& obj1, const CFile& obj2) {
if ( obj1.m_size > obj2.m_size )
return true;
else
return false;
}
};
【问题讨论】:
-
也许我没有得到它,但是由于地图是按键排序的,
*being()和*rbegin()最小的就是最大的键吗? -
地图按键文件名(不是文件大小)排序。
-
你是怎么做到的?我在这里看到的一切都让我相信它会按文件大小排序。地图是如何声明的?
-
我有一个全局声明的
bool operator< (CFile obj1, CFile obj2) { return obj1.getFileName()<obj2.getFileName(); },它按文件名对配对进行排序。
标签: c++ algorithm dictionary multimap