【发布时间】:2018-05-10 14:47:29
【问题描述】:
我被分配了以下任务:创建一个包含男性、女性和未知姓名的文本文件。尝试实现一个过滤器,将这些姓名与真实姓名进行比较(因此总共输入 3 个文件:男性、女性,假设是租房者)。过滤时将匹配的名称放入相应的容器中。在我看来,这很简单,所以我按照我在下面提供的方式进行了操作。
我的问题是:有没有办法优化这段代码?
我尝试使用抽象类并基于抽象实体创建 4 个不同的对象(男人、女人、已知、未知)。但是对于这样一个简单的任务,代码量仍然很大。另一个想法是使用 lambda 表达式,但我仅限于 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;
}
【问题讨论】:
-
"但我仅限于 C++ 98。" - 这样的老师不应该已经退休了吗?
-
"有没有办法优化这段代码?"优化是指减少代码量,还是让代码运行得更快?
-
为什么需要为女性和男性使用不同的容器?您为什么要搜索
vector而不是set?你为什么要将租用者读入一个集合然后循环遍历它? -
codereview.stackexchange.com 可能更适合这个问题。
-
编写一个函数来读取名称文件并返回这些名称的排序向量。用它来阅读男人和女人。获得这两个向量后,只需一次从租户那里读取一个名称,然后检查它是否在两个向量中的任何一个中。您无需在搜索前存储所有租用者姓名。
标签: c++ file vector filter c++98