对象的向量搜索未来对象的使用?

Vector of objects search for future objects' use?

本文关键字:对象 未来 向量搜索      更新时间:2023-10-16

我有数据文件,这是读到一个向量。例子:

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.getHomeGamesPlayed();
ht.getPoints();
ht.getHomeGoalsScored();
所以,我的问题是:有没有更好的搜索方式?(使用map of names + vector of double ?):
map<name, vector<doubles>>;

另外,如何使搜索大小写不敏感?也就是说,我输入leicester而不是leicester CIty, leicester CIty仍然会被选中?

乌利希期刊指南:好像我弄明白了,如果你感兴趣的话,下面是代码:

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时,它不起作用)

是的,std::map将更适合您的问题。std::unordered_map也是。

要获得不区分大小写的匹配,可以使用已转换为全大写或全小写的字符串作为映射键。然后将原始名称单独存储。

std::map<std::string, std::pair<std::string, std::vector<double>>> mymap;

如果你需要部分匹配,例如,当你输入leicester时找到Leicester City,你现在使用的向量方法可能是最好的。如果您只需要匹配名称的第一个部分,您仍然可以使用std::mapmap::lower_bound来查找搜索的起始位置。

这个问题有几个解决方案。我建议使用具有多个输入位置的基数树。

首先,创建一个map或set之类的来存放对象。然后,创建一个基数树,索引给定宽度的每个部分匹配,例如

中的fge

为"abcde fge", "bcde fge", "cde fge",…"e"。指向你的(多)地图值。您可以使用基数树的属性,您可以轻松地找到具有给定前缀的所有值来执行快速搜索,以便在大约O(1)(或在N个大小的搜索项中O(N))内找到给定子字符串的所有匹配,前提是您有固定的输入大小。但是请注意,树的构建规模为可搜索材料大小的O(n^2),为了解决这个问题,您可以限制索引的搜索词的大小(例如50个字符),或者在多次搜索之后进行增量索引(例如索引"abcdefg"cdefg"answers"efg",然后在搜索"def"时搜索"def"answers"ef","ef"的结果与efg的前缀匹配)

请注意,搜索字符串必须至少与您跳过的宽度一样长,否则您将不得不搜索整个树。