搜索值

时间:2013-10-24 20:11:40

标签: c++ search structure partial

我正在尝试在结构中搜索我输入的值。但是,即使我只输入单词的一部分,我也希望搜索能够正常工作。我该怎么做?

这是我的代码:

for (int i = 0; i < size; i++)
{
    if (searchName == ptrCandy[i].name)
    {
      cout << "Name: " << ptrCandy[i].name << "\n" << "Quantity: " << ptrCandy[i].quantity;
      cout << "\n" << fixed << setprecision(2) << "Cost: $" << ptrCandy[i].cost << "\n" << endl;
    }
}

4 个答案:

答案 0 :(得分:1)

我假设如果您输入n个字符,您只想匹配以这n个字符开头的糖果元素,而不是尝试进行任何自动更正或拼写检查等。如果这些是正确的假设,那么让STL为您完成工作:

int searchLength = searchName.length();
for( int i=0; i<size; i++ ) {
    if ( ptrCandy[i].name.length() >= searchLength &&
         searchName == ptrCandy[i].name.substr( 0, searchLength ) ) {
    // Found it!
    }
}

例如,如果您有一个名为“士力架”和“零食组合”的糖果,那么如果您输入“sn”,它将返回这两个,但如果您输入“sni”,您将只获得“士力架” ”

答案 1 :(得分:0)

首先,您需要一个阈值来确定匹配的接近程度。是1个字母好吗?

第二,决定它是否必须从一开始或一个单词的开头匹配,例如是否对“气味”起作用?

然后,如果您不想使用其他库,请遍历每个字符并继续,直到达到阈值或字符串结尾

换句话说,如果名称是“Long dude one”并且搜索字符串是“dude”,则从name [0]开始并执行4迭代循环(dude中的四个字母)并检查每个名字中对应的一个。如果任何字母不匹配,退出该循环。然后从名称[1]到名称[4],然后从名称[2]到名称[5]等一直做同样的事情,直到你检查搜索字符串“1”的最后4个字母对抗花花公子。但是,你不会那么远,因为在第6次尝试时,例如循环通过名称[5]到名称[8],所有4个字母都匹配,所以你要设置match = true并退出。

将它放在一个函数中并为每个名称调用它。

答案 2 :(得分:0)

假设这些类型属于std::string

for (int i = 0; i < size; i++)
{
    size_t pos = ptrCandy[i].name.find(searchName);
    if (pos != string::npos)
    {
      cout << "Name: " << ptrCandy[i].name << "\n" << "Quantity: " << ptrCandy[i].quantity;
      cout << "\n" << fixed << setprecision(2) << "Cost: $" << ptrCandy[i].cost << "\n" << endl;
    }
}

如果你想要不区分大小写,只需将两个字符串转换为全部大写或全部小写,然后对修改后的字符串进行搜索。

答案 3 :(得分:0)

您可以使用成员函数比较以下方式

for (int i = 0; i < size; i++)
{
    if ( ptrCandy[i].name.compare( 0, searchName.size(), searchName ) == 0 )
    {
      cout << "Name: " << ptrCandy[i].name << "\n" << "Quantity: " << ptrCandy[i].quantity;
      cout << "\n" << fixed << setprecision(2) << "Cost: $" << ptrCandy[i].cost << "\n" << endl;
    }
}