Мне было дано следующее задание: создать текстовый файл, содержащий мужчин, женщин и неизвестные имена. Попробуйте реализовать фильтр, который будет сравнивать эти имена с реальными именами (итого 3 входных файла: мужчины, женщины и, скажем, арендаторы). При фильтрации поместите совпадающие имена в соответствующие контейнеры. Это показалось мне довольно прямым, поэтому я сделал это так, как я представляю внизу.
Мой вопрос: Есть ли способ, как оптимизировать этот код?
Я пытался использовать абстрактные классы и создавать 4 различных объекта (Мужчина, Женщина, Известный, Неизвестный) на основе абстрактной сущности. Но объем кода был все еще велик для такой простой задачи. Другая идея заключалась в том, чтобы использовать лямбда-выражения, но я ограничен только C ++ 98.
Я думаю, что я обдумываю это ...
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
int main()
{
std::ifstream men("resources/men_names.txt");
std::ifstream women("resources/women_names.txt");
std::ifstream renters("resources/renter_names.txt");
std::vector<std::string> menNames;
std::vector<std::string> womenNames;
std::vector<std::string> renterNames;
std::vector<std::string> knownRenters;
std::vector<std::string> unknownRenters;
std::string name;
while (men >> name)
menNames.push_back(name);
men.close();
while (women >> name)
womenNames.push_back(name);
women.close();
while (renters >> name)
renterNames.push_back(name);
renters.close();
std::vector<std::string>::iterator itMen;
std::vector<std::string>::iterator itWomen;
std::vector<std::string>::iterator itRenters;
for (itRenters = renterNames.begin(); itRenters != renterNames.end(); itRenters++)
{
bool found = false;
for (itMen = menNames.begin(); itMen != menNames.end(); itMen++)
{
if ((*itMen) == (*itRenters))
{
found = true;
knownRenters.push_back((*itMen));
}
}
if (!found)
{
for (itWomen = womenNames.begin(); itWomen != womenNames.end(); itWomen++)
{
if ((*itWomen) == (*itRenters))
{
found = true;
knownRenters.push_back((*itWomen));
}
}
}
if (!found)
unknownRenters.push_back((*itRenters));
}
std::cout << knownRenters.size() << '\n';
std::cout << unknownRenters.size() << '\n';
std::cin.get();
return 0;
}