2016-05-30 9 views
-2

私は束のデータ型を保持する一般的な構造を持っています。たとえば、文字列に基づいてベクトルから特定の項目を取得します

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

ここでは、私は学生のベクトルを持っています。

std::vector<student> cls; 

私はchar * idを持っているとどのようにして特定の生徒を得ることができますか?または、別の推奨方法がありますか?学生IDと学生の構造のハッシュを維持している可能性がありますか?

ありがとうございます!あなたは、変数名として「クラス」を使用することはできません、と私はのstd ::文字列の代わりに文字*を使用することをお勧めします:

+5

変数名が言語のキーワードと同じ色で点灯しているときに何か問題があります。 – LogicStuff

+0

ありがとう! –

答えて

2

あなたは脇に

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); 

find_ifのstd ::の使用することができます。

+0

あなたは古代の 'strcmp'トラップに入り、' == 0'を忘れました。 – molbdnilo

+0

@molbdnilo、thanks :) – thorsan

+1

ありがとう!私はこの場所で止めたいかもしれない。 student&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は、char *の代わりにstd :: stringを使用し、std :: mapについて読むと、O(1)のstd :: map とget(id) – Exceptyon

0

std::mapid

student found; 
map<string, student>::iterator it = m.find(id); 
if (it != m.end()) 
    found = it->second; 
を見つけるために、そして、

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

std::map<string, student> m; 

優れているとされていますが必要になる場合があります疑います

関連する問題