【问题标题】:Get index of element in a struct c++获取struct c ++中元素的索引
【发布时间】:2020-05-15 08:17:56
【问题描述】:

我想获取结构中元素的索引。下面是代码。但是它只返回 0 作为输出。假设我已经将数据添加到下面的结构中,函数 find_index 不返回元素的索引。它只返回 0;

struct Person{
    string name;
    int age;
    float spread_prob;
    float disease_prob;
    float recover_prob;
    status disease_status;
    int sick_day;
};

Person person[9];

int find_index(string m){
    for(i=0;i<9;i++){
        if(m==person[i].name){
            return i;   
        }   
    }
    return 0;
}

【问题讨论】:

  • person 在哪里/如何定义?你用什么称呼它?请扩展您的问题,使其成为minimal reproducible example
  • 代码中的大量错误,包括未定义 i、未阐明函数范围(如果主要考虑使用 lambda 访问结构)以及不必要地使用语句,例如返回 0。
  • @Anirban166 这只是我的代码的一个 sn-p,我已经在我的代码中定义了 i。该函数不在main中。
  • 你确定 m 的值完全等于数组中的某个人吗?实际上 std::string::operator== 严格比较值,例如“Aileen”NOT 等于“Aileen\0”,即使您会看到它们的输出相同。
  • 返回 0 作为未找到的值似乎很奇怪,因为它是一个有效的索引,所以您不知道是否未找到值,或者第一个元素是否正确。

标签: c++ indexing struct element


【解决方案1】:

首先,您的代码存在语法错误,例如未定义循环变量 i 以及逻辑错误,例如在 for 循环中返回 0,(这意味着无论任何索引匹配,您的函数都只会返回 0 ) 并返回 0 本身是一个错误,因为这意味着您的字符串或名称在第一个索引处找到。如果您不关注数组索引,请考虑在 return 语句中添加 +1。否则,请使用其他内容,例如 -1 或任何负数来指示该字符串在任何索引中都未找到/匹配。

接下来,您的代码未在 minimal reproducible example 的适当范围内定义(可以直接复制粘贴并在我们的编译器上测试)。

考虑到Person 对象在main() 中,我在主范围内创建了一个lambda / 临时函数,它应该可以帮助您解决问题:(考虑到结构的name 成员和3 个@987654328 的数组@对象用于演示)

#include <iostream>

struct Person
{
    std::string name;
};

int main()
{
  Person person[3]; 
  person[0].name = "Karl"; 
  person[1].name = "John";
  person[2].name = "Felix";

  auto findIndex = [=](std::string m)
  { for(int i = 0; i < 3; i++) 
    { if(m == person[i].name)
      return i;
    }
    return -1;    
  };

  std::cout << findIndex("Felix");
  std::cout << "\n";
  std::cout << findIndex("Blaze"); 
}

输出:

2
-1

【讨论】:

  • 谢谢,我创建的函数在一个类中,它在主类中使用。如果这在类中有效,我会更新你
【解决方案2】:

return 0 在你的 for 循环中。因此,当第一次迭代匹配时,return i 返回 0,如果不是这种情况,则调用 return 0。将return 0 移出循环,这样循环在一次迭代后就不会中断。

【讨论】:

  • 所以我把它放在了 for 循环之外,它仍然返回 0;
  • 我不知道您使用的示例名称,以帮助您更多。如果您还发布了如何填写person-变量以及您的示例中的m 是什么,那将会很有帮助。您还可以在 if 条件中添加打印输出以检查 mperson[i].name 的值。
【解决方案3】:
int find_index(string m){
    int ret = -1; // -1 denotes not available

    for(i=0;i<9;i++){
        if(m==person[i].name){
            ret = i;
            break;   
        }   
    }
    return ret ; //If it matches it will return the index on which it breaks.
}

您可以使用返回变量。

【讨论】:

    猜你喜欢
    • 2013-07-25
    • 2011-12-14
    • 2012-04-09
    • 2023-03-24
    • 2013-12-03
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多