C++ 如何搜索记录以按名称或部分名称查找?C++;
我有一个结构如下的程序:C++ 如何搜索记录以按名称或部分名称查找?C++;,c++,algorithm,search,C++,Algorithm,Search,我有一个结构如下的程序: struct FundData { char fundName[SIZE]; //Fund Name char fundInception[SIZE]; //Fund inception date double ytd; //Year to date return as percent double oneYear; //1 year Return as percent double threeYear; //3 year Ret
struct FundData
{
char fundName[SIZE]; //Fund Name
char fundInception[SIZE]; //Fund inception date
double ytd; //Year to date return as percent
double oneYear; //1 year Return as percent
double threeYear; //3 year Return as percent
double fiveYear; //5 year Return as percent
double tenYear; //10 year Return as percent
double fundExpense; //Fund Yearly Expense as percent
};
FundData newData[5];
我使用菜单将结构的记录添加到文件中,显示所有记录,现在删除记录时遇到问题。我不知道如何使用全名或部分名称搜索记录。我尝试使用seekg,但它不允许我按字符数组进行搜索。我需要按全部或部分基金名称搜索基金,显示该基金的数据,然后提示用户确认删除。但是,我仍停留在第一部分,即查找记录。有一种方法可以仅使用原始数组来实现这一点 标准库包含各种各样的算法,这些算法适用于大量用例。提供的算法之一正是您要查找的算法:
std::find_if
它是这样使用的:
// put that include in the top of the file
#include <algorithm>
auto the_one_to_find = "name to find";
auto found_element = std::find_if(
std::begin(newData), std::end(newData),
[&](const FundData& data) {
return std::strncmp(data.fundName, the_one_to_find, SIZE);
}
);
// if the fund has been found
if (found_element != std::end(newData)) {
std::cout << found_element->fundName; // found it!
}
//将包含的内容放在文件的顶部
#包括
自动选择要查找的名称;
自动查找元素=std::查找元素if(
标准::开始(新数据),标准::结束(新数据),
[&](const FundData&data){
返回std::strncmp(data.fundName,要查找的对象,大小);
}
);
//如果找到了资金
如果(找到元素!=std::end(newData)){
std::cout fundName;//找到了!
}
必须使用C++14才能使用
std::begin
和std::end
,它在所有最近的编译器上都可用,并且通常在默认情况下启用。下面的函数模板find_name()
执行线性搜索()在传递的FundData
数组上,查找字符串name
为fundName
的元素。它用于比较字符串,而不是std::strcmp
array_len()
只是一个方便的函数模板,用于推断内置数组的大小(用于数组数据成员fundName
)
模板
大小\u t数组\u len(t(&arr)[N]){
返回N;
}
模板
FundData*查找名称(FundData(&arr)[N],std::string name){
自动pred=[&name](const FundData&data){
return!std::strncmp(data.fundName,name.c_str(),array_len(data.fundName));
};
自动it=std::find_if(std::begin(arr)、std::end(arr)、pred);
if(std::end(arr)==it)
返回空ptr;
返回&*它;
}
然后,您可以这样使用它:
auto main() -> int {
FundData newData[5];
// ...
auto ptr = find_name(newData, "FooBar");
if (ptr)
std::cout << ptr->fundName << '\n';
}
auto main()->int{
FundData新数据[5];
// ...
自动ptr=查找_名称(newData,“FooBar”);
如果(ptr)
STD::CUT FUNDIQUE,首先,不要在C++中使用数组,如果是固定长度,尝试使用<代码> STD::数组< /C>,如果使用可变长度,尝试使用<代码> STD::vector < /C> >,而使用C样式数组和指针是很多bug的大门。第二:最简单的方法是使用C++标准库中的算法< /Cult>库。,您可以使用find_if
,也可以使用for循环在数组中正常迭代。要搜索部分字符串,可以使用std::search
:我是一个非常基本的介绍类,不幸的是,我们还没有完成任何操作。他们给了我们使用的结构,但我似乎无法搜索文件;我可以搜索通过一个基本数组,但该文件使我感到厌烦。因为看起来您被迫使用字符数组作为字符串。它将与数组1和数组2的前N个字符进行比较,如果它们匹配,则返回true。有关示例,请参阅链接文档页。仔细想想,只有当部分名称必须位于全名的开头。如果你想在“麦当劳”中找到“堂”,你必须更加努力。首先,你要把所有的东西都转换成普通的大小写,否则“堂”和“堂”不匹配@Computer文盲--我需要按全部或部分基金名称搜索基金,显示该基金的数据,然后提示用户确认删除--如果有多个名称与部分搜索匹配怎么办?进行这些部分搜索的“现实世界”方法是构建一个由基金名称组成的(阅读链接中的字典表示部分)。另外,使用字符串本身的std::begin
和std::end
可以将std::strcmp
替换为std::search
,至少使用strncmp
,因为如果字符串没有正确地以null结尾,则可能会导致漏洞
auto main() -> int {
FundData newData[5];
// ...
auto ptr = find_name(newData, "FooBar");
if (ptr)
std::cout << ptr->fundName << '\n';
}