在 C++ 98 中优化向量过滤
Optimizing filtering of a vector in C++ 98
我接到了以下任务:创建一个包含男性、女性和未知姓名的文本文件。尝试实施一个过滤器,将这些姓名与真实姓名进行比较(因此总共输入 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
#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;
}
你不在乎租客是男是女,只要他们有一个公认的名字即可。因此,不要存储两个已知名称的平面向量,存储所有已识别名称的单个 std::set<std::string>
(或排序向量,或者 std::unordered_set
如果您被允许使用 C++11 ).
然后,您可以进行一次对数时间查找(或 C++11 版本的常数时间),而不是(最多)对每个承租人进行两次线性搜索。
您似乎也不关心被识别(或未被识别)的租户的名字,所以不要保留两个结果向量:只需递增 known
或 unknown
柜台.
我接到了以下任务:创建一个包含男性、女性和未知姓名的文本文件。尝试实施一个过滤器,将这些姓名与真实姓名进行比较(因此总共输入 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
#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;
}
你不在乎租客是男是女,只要他们有一个公认的名字即可。因此,不要存储两个已知名称的平面向量,存储所有已识别名称的单个 std::set<std::string>
(或排序向量,或者 std::unordered_set
如果您被允许使用 C++11 ).
然后,您可以进行一次对数时间查找(或 C++11 版本的常数时间),而不是(最多)对每个承租人进行两次线性搜索。
您似乎也不关心被识别(或未被识别)的租户的名字,所以不要保留两个结果向量:只需递增 known
或 unknown
柜台.