我有数据文件,正在被读入矢量。例子:
West Ham 38 12
Leicester City 38 13在实际文件中,名称后面有更多的双倍。不管怎么说,以前我用过这样的搜索:
vector<Team>newTeams; //vector of Team objects
string homeName;
cout << "Enter home team name: ";
cin >> homeName;
cout << endl;
Team ht;
for(Team team : newTeams)
{
if(team.getName() == homeTeam)
{
ht = team;
}
}基本上,我通过一个向量,寻找一个特定的团队名称。如果我找到了团队的名字,我就指派团队到ht。然后,我将使用ht获取所需的数据,即:
ht.getHomeGamesPlayed();
ht.getPoints();
ht.getHomeGoalsScored();因此,我的问题是:是否有更好的搜索方法?(使用名称地图+双数向量):
map<name, vector<doubles>>;此外,如何使搜索不敏感?我输入莱斯特而不是莱斯特CIty,莱斯特城还会被选中吗?
UPD:似乎已经搞清楚了,如果您感兴趣的话,下面是代码:
string homeName;
cout << "Name: " << endl;
cin >> homeName;
Team ht;
for (Team team : dataTable) {
if (strstr(team.getName().c_str(), homeName.c_str()))
{
ht = team;
}
}所以当我输入leic时,它会选择Leicester City(当我输入Leic时,它不起作用)
发布于 2016-09-06 18:41:45
是的,std::map会更适合你的问题。std::unordered_map也会。
要获得不区分大小写的匹配,可以使用已转换为所有大写或全部小写的字符串作为映射键。然后分别存储原始名称。
std::map<std::string, std::pair<std::string, std::vector<double>>> mymap;如果需要部分匹配,例如在键入Leicester City时查找leicester,那么现在使用的向量方法可能是最好的。如果只需要在名称的第一部分匹配,仍然可以使用std::map并使用map::lower_bound查找搜索的起始位置。
发布于 2016-09-06 19:21:35
这个问题有几个解决办法。我建议的是一个具有多个输入位置的基树。
首先,创建一张地图或集合或任何东西来保存您的对象。然后,创建一个基树,对给定宽度的每个部分匹配进行索引。
abcde fge
创建一个条目"abcde fge","bcde fge","cde fge",."e“指向您的(多个)映射值。您可以使用基树的属性,可以很容易地找到具有给定前缀的所有值,以执行快速搜索,在O(1) (或N大小搜索项中的O(N) )附近查找给定子字符串的所有匹配项,条件是输入大小固定。然而,请注意,在搜索材料大小的O(n^2)中构造树尺度,为了纠正这一点,可以限制索引索引的搜索项的大小(例如,50个字符),或者以递增的方式进行索引,然后进行多次搜索(例如索引"abcdefg“"cdefg”和"efg",然后在搜索"def“和"ef”时,搜索与efg前缀匹配的"ef“结果)。
请注意,搜索字符串必须至少与跳过的宽度相同,否则必须搜索整棵树。
https://stackoverflow.com/questions/39355669
复制相似问题