【问题标题】:C++ Access member of struct/class using map使用映射的结构/类的 C++ 访问成员
【发布时间】:2013-04-24 18:19:53
【问题描述】:

我需要搜索一个由指向名为 Person 的结构的指针的链接列表组成的数据库。在 Person 内部有一堆数据——名字、姓氏、社会保障等。这都是虚构的和无关紧要的。我的问题是我需要根据用户输入进行搜索,这决定了结构的哪个部分正在与搜索进行比较。由于所有数据都存储为 struct Person 的成员,我认为最好的方法(如不编写 8 个搜索函数)是通过映射,但我对映射的掌握非常差,几乎不存在.以下是相关代码:

List * find(List * database, //mapping stuff, string name)
{
     //run search
     return database;
}

void search(List * database)
{
    string field, searchtype, userinput;
    cout << "To search for a person, enter information in this format: 'field equal
    value' or 'field begins value'. Type 'clear' to 
    return to original database. Type 'exit' to leave the program\n";

while(field != "exit")
{
    cin >> field >> searchtype >> userinput;
    if(userinput == "firstname")  //this is just for example, I would have to write one of these out for each parameter.
    {
        List * smallerdb = find(database, map(//mapping stuff?), string userinput);
    }
}
}

这是给学校的,所以请不要建议我只使用另一个图书馆,因为我不能。谢谢!

【问题讨论】:

  • 你不需要映射。您需要一个参数化的 comparator ,它被初始化为要比较的字段的“状态”。然后在比较您的项目时使用该比较器(可能是函子)。
  • 也许您想将一个指向成员的指针传递给您的搜索函数,并使用它来获取要从列表中的每个项目中搜索的数据。
  • 我想我把函子误认为是映射,但我对函子仍然很模糊。你认为你能给我指明正确的方向吗?

标签: c++ list search mapping member


【解决方案1】:

必须对每种数据类型进行不同的比较,因此如果不明确知道数据类型,您将不走运。字符串按字母顺序比较,数字按值比较,我不确定您是否有任何其他自定义数据类型。

因此,除了逐个案例分析之外,您实际上并没有太多选择。例如。

    if type == 'name'                // compare each Person.name as string
    else if type == 'socialSecurity' // compare Person.socialSecurity as int
    else if ...

以下是使此代码更加健壮的建议。

您可以简单地返回一个函数指针,而不是在每种情况下处理搜索逻辑,而不是告诉您如何比较两个Personsactual 函数可能会按姓名、年龄、社会保障等进行比较,但您的搜索函数一旦有了告诉它如何比较两个 @ 的函数指针,就不必关心这些了987654323@ 个对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2021-04-18
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多