Есть ли способ, которым вы могли бы использовать алгоритмы map.find()/map.count() для ключа, который является типа объекта класса?Использование map.find() и count() для ключа, который является типом объекта класса
My multimap состоит из пар - map.<myClass, enum>
и у myClass есть член, например, имя файла. Я хотел бы искать дубликаты имен файлов на моей карте, и я прочитал, что функции find() и count() выполняют это для ключей, но можно реализовать их для поиска члена ключа?
Вот код:
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;
}
};
Я хочу найти дубликаты string m_strFile
;
Это будет лучше, если вы может опубликовать некоторый код, предпочтительно [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve). –
Что вы хотите, так это std :: find_if (http://www.cplusplus.com/reference/algorithm/find_if/) – kfsone
См. Мой комментарий к ответу Ричарда Ходжа относительно перегрузки вашего оператора. Что касается использования одного сравнения для хранения на карте или в поиске карты ... вы не можете выполнять поиск с помощью функции поиска карты, потому что эта функция использует поиск двоичного дерева. Вам нужно использовать find_if, который будет линейно перемещаться по дереву, чтобы найти объект. –