我有这个程序,我将多个Class Object +枚举放在一个multimap中。类对象的成员类型为int filesize。我想在我的multimap中找到最大和最小的键。
我通过制作3个迭代器,将每个对象与下一个对象进行比较,如果它更小(或者更大,取决于我搜索的内容),则将其分配给第3个迭代器。之后,我打印出第3个迭代器。有没有其他优雅的方法来做到这一点?我知道这有效,但我确定还有另一种做法 - 我似乎无法找到它。
这是我的max file函数:
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;
}
第二个类的构造函数,我在其中创建multimap并用另一个类对象+枚举(从文件中读取)填充它:
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;
}
}
第一个类(哪个对象是我的multimap中的键):
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;
}
};
答案 0 :(得分:1)
std::minmax_element
允许您在查看对象时传递比较器,以便您可以执行以下操作:
auto p = std::minmax_element(m_directoryMap.begin(), m_directoryMap.end(),
[](CFile const &a, CFile const &b) { return a.getFileSize() < b.getFileSize(); });
p
将成为您的集合中的一对迭代器,因此您可以(例如)将它们打印出来:
std::cout << "Smallest: " << p.first->getFileSize() << " bytes\n";
std::cout << "Largest: " << p.second->getFileSize() << " bytes\n";
但是,仔细观察,无论如何,您似乎都在使用size成员作为文件的排序。既然如此,您可以根据您关注的数据使用地图已经订购的事实,因此您可以使用:
std::cout << "Smallest: " << m_directoryMap.begin()->getFileSize() << " bytes\n";
std::cout << "Largest: " << m_directoryMap.rbegin()->getFileSize() << " bytes\n";
然而,仔细查看您的代码,您还有一些其他问题可能会影响您在此处尝试执行的操作。这是一个稍微简化(和重写)的代码版本,以及一些代码,用于查找最小值和最大值(并打印出来):
#include <string>
#include <iostream>
#include <map>
#include <algorithm>
using std::string;
using std::istream;
using std::ostream;
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 const& obj) const {
return (m_size < obj.m_size);
}
bool operator== (const CFile& obj) const {
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) {
return (obj1.m_size > obj2.m_size);
}
};
struct cmp {
bool operator()(CFile const &a, CFile const &b) {
return a.getFileName() < b.getFileName();
}
};
int main() {
std::multimap<CFile, int, cmp> files {
{ CFile { "abc", 123 }, 1 },
{ CFile { "cde", 234 }, 2 },
{ CFile { "def", 345 }, 3 }
};
auto p = std::minmax_element(files.begin(), files.end(),
[](auto const &a, auto const &b) { return a.first.getFileSize() < b.first.getFileSize(); });
std::cout << p.first->first.getFileSize() << "\n";
std::cout << p.second->first.getFileSize() << "\n";
}