C++ 优化C+中向量的滤波+;98

C++ 优化C+中向量的滤波+;98,c++,file,vector,filter,c++98,C++,File,Vector,Filter,C++98,我被分配了以下任务:创建一个包含男人、女人和未知姓名的文本文件。尝试实现一个过滤器,将这些姓名与真实姓名进行比较(因此输入中总共有3个文件:男性、女性,比方说租房者)。过滤时,将匹配的名称放入相应的容器中。在我看来,这是非常直截了当的,所以我按照我提供的方式做了 我的问题是:有没有办法优化这段代码? 我尝试使用抽象类并基于抽象实体创建4个不同的对象(男人、女人、已知、未知)。但是对于这样一个简单的任务,代码量仍然很大。另一个想法是使用lambda表达式,但我仅限于C++ 98。 我觉得我想得太多

我被分配了以下任务:创建一个包含男人、女人和未知姓名的文本文件。尝试实现一个过滤器,将这些姓名与真实姓名进行比较(因此输入中总共有3个文件:男性、女性,比方说租房者)。过滤时,将匹配的名称放入相应的容器中。在我看来,这是非常直截了当的,所以我按照我提供的方式做了


我的问题是:有没有办法优化这段代码?


我尝试使用抽象类并基于抽象实体创建4个不同的对象(男人、女人、已知、未知)。但是对于这样一个简单的任务,代码量仍然很大。另一个想法是使用lambda表达式,但我仅限于C++ 98。 我觉得我想得太多了

#包括
#包括
#包括
#包括
int main()
{
std::ifstream men(“resources/men_names.txt”);
std::ifstream women(“resources/women_names.txt”);
std::ifstream renters(“resources/renter_names.txt”);
std::矢量菜单名;
性病:病媒女性;
std::载体租赁名称;
std::矢量已知中心;
std::向量未知中心;
std::字符串名;
while(男性>>姓名)
menNames.push_back(名称);
男人。接近();
while(女性>>姓名)
女人的名字。推回(名字);
女性。接近();
while(租客>>姓名)
承租人姓名。推回(姓名);
renters.close();
std::vector::迭代器itMen;
std::vector::迭代器;
std::vector::迭代器输入;
for(iTenters=renterNames.begin();iTenters!=renterNames.end();iTenters++)
{
bool-found=false;
for(itMen=menNames.begin();itMen!=menNames.end();itMen++)
{
如果((*itMen)=(*ITENTERS))
{
发现=真;
知识中心。推回((*itMen));
}
}
如果(!找到)
{
for(itWomen=womenNames.begin();itWomen!=womenNames.end();itWomen++)
{   
如果((*itWomen)==(*ITEnters))
{
发现=真;
知识中心。推回((*itWomen));
}
}   
}
如果(!找到)
未知入口。推回((*ITenters));
}

std::cout对现有代码的缩短。这应该都是C++98

#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <iterator>

int main()
{
    std::ifstream men("resources/men_names.txt");
    std::ifstream women("resources/women_names.txt");
    std::set<std::string> peopleNames;

    peopleNames.insert(std::istream_iterator<std::string>(men), std::istream_iterator<std::string>());
    peopleNames.insert(std::istream_iterator<std::string>(women), std::istream_iterator<std::string>());

    std::ifstream renters("resources/renter_names.txt");
    std::vector<std::string> knownRenters;
    std::vector<std::string> unknownRenters;

    for (std::string name; renters >> name; )
    {
        if (peopleNames.count(name))
            knownRenters.push_back(name);
        else
            unknownRenters.push_back(name);
    }

    std::cout << knownRenters.size() << '\n';
    std::cout << unknownRenters.size() << '\n';

    std::cin.get();

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
std::ifstream men(“resources/men_names.txt”);
std::ifstream women(“resources/women_names.txt”);
std::设置peopleNames;
insert(std::istream_迭代器(men),std::istream_迭代器());
insert(std::istream_迭代器(女性),std::istream_迭代器());
std::ifstream renters(“resources/renter_names.txt”);
std::矢量已知中心;
std::向量未知中心;
对于(std::string name;renters>>name;)
{
if(peopleNames.count(name))
知道输入。推回(名称);
其他的
未知的入口。推回(名称);
}

std::cout你不在乎租客是男性还是女性,只要他们有一个可识别的名字。因此,不要存储两个已知名字的平面向量,存储所有可识别名字的单个
std::set
(或者一个排序向量,或者一个
std::unordered\u set
,如果允许使用C++11)

然后,您可以执行单个对数时间查找(对于C++11版本,则为常数时间),而不是(最多)对每个租户执行两次线性搜索


你似乎也不关心被认可的租户的名字,所以不要保留两个结果向量:仅仅增加一个代码>已知的< /代码>或<代码>未知<代码>计数器> < /p>“但我只限于C++ 98。”-难道这些教师不应该退休吗?“有没有办法优化这个代码?”通过优化,您的意思是减少代码量,或使代码运行更快?为什么您需要为女性和男性使用不同的容器?为什么您要搜索

向量而不是
集合
?为什么您要将租用者读入集合,然后在集合上循环?可能更适合这个问题。编写一个函数来重新搜索添加一个名称文件并返回这些名称的排序向量。使用它来读取男性和女性。一旦获得了这两个向量,只需从renters一次读取一个名称,并检查它是否位于这两个向量中的任何一个。在搜索之前,您不需要存储所有的renters名称。2 OP-如果无法使用
std::set
替换它wIs<代码> STD::向量< /代码>,在插入后或插入时排序,然后使用<代码> STD::BialySythySuth/Cuth>我知道了!谢谢!是的,现在我明白了。我只限于C++ 98,但是STD::SET工作得很好。仍然学习…谢谢!
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <iterator>

int main()
{
    std::ifstream men("resources/men_names.txt");
    std::ifstream women("resources/women_names.txt");
    std::set<std::string> peopleNames;

    peopleNames.insert(std::istream_iterator<std::string>(men), std::istream_iterator<std::string>());
    peopleNames.insert(std::istream_iterator<std::string>(women), std::istream_iterator<std::string>());

    std::ifstream renters("resources/renter_names.txt");
    std::vector<std::string> knownRenters;
    std::vector<std::string> unknownRenters;

    for (std::string name; renters >> name; )
    {
        if (peopleNames.count(name))
            knownRenters.push_back(name);
        else
            unknownRenters.push_back(name);
    }

    std::cout << knownRenters.size() << '\n';
    std::cout << unknownRenters.size() << '\n';

    std::cin.get();

    return 0;
}