2016-05-30 50 views
-2

我有一个通用的结构,其中包含一堆数据类型。例如,从字符串得到一个特定的东西基于字符串

struct student 
{ 
    char* name; 
    char* id; 
    double avg_score; 
}; 

现在,我有一个学生矢量。

std::vector<student> cls; 

如何获得某个学生,如果我有char * id?或者还有其他推荐方法吗?可能会保留学生证和学生结构?

在此先感谢!

+5

当您的变量名称与语言的关键字具有相同的颜色时,有些问题。 – LogicStuff

+0

更正了谢谢! –

回答

2

您可以使用std :: find_if

const char* idToFind = "sdfsd"; 
std::vector<student> cls; 
... 
auto iter = std::find_if(cls.begin(), cls.end(), [=](student& s) {return strcmp(s.id, idToFind) == 0;}); 
student& s = *iter; 
int index = std::distance(cls.begin(), iter); 

在一旁:你不能用“一流”为变量的名字,我会建议使用的std :: string,而不是字符*。

+0

你陷入了古老的'strcmp'陷阱并忘记了== 0。 – molbdnilo

+0

@molbdnilo,谢谢:) – thorsan

+1

谢谢!我可能想在这个地方停下来。学生&s = * iter; –

1

类似:

int getStudentIndex(std::vector<student> students, char* id) { 

    const int sz = students.size(); 
    for (int i=0; i<sz; i++) 
     if (strcmp(students[i].id, id) == 0) 
      return i; 

    return -1; // not found 
} 

但我怀疑你可能需要std::map

+0

这是我可能想要的,也许不是索引,而是它自己的学生结构。我可以微调这一点。谢谢! –

+0

@RCBrand考虑使用std :: string而不是char *,并阅读std :: map,你可以在O(1)中使用std :: map 和get(id) – Exceptyon

0

一个std::map本来不错

struct student { 
    std::string name; 
    double  avg_score; 
}; 

std::map<string, student> m; 

然后,找到一个id

student found; 
map<string, student>::iterator it = m.find(id); 
if (it != m.end()) 
    found = it->second; 
相关问题