检查向量是否包含具有已输入值的对象
Check if a vector contains object with already entered values
所以我正在为这些事情苦苦挣扎:
我有方法 returns istream 输入并将 istream 输入作为参数,将值发送到 vector 并将它们存储在其中。现在,当我输入 1 个值时,我试图检查 vector 是否已经包含该值,这里是我的代码以更好地理解它:
struct Predmet {
string naziv;
string odsjek;
istream& dodaj_predmet(istream &);
};
struct Student {
string brojIndeksa;
string ime;
string prezime;
map<std::string, int> ocjene;
istream& dodaj_studenta(istream &);
};
vector<Student> studenti;
vector<Predmet> predmeti;
Student s;
Predmet p;
istream& Student::dodaj_studenta(istream & input){
cout << "### Unesite podatke o studentu: " << endl;
cout << endl;
cout << "Unesite broj indeksa studenta: " << endl;
getline(input, brojIndeksa);
cout << endl;
cout << "Unesite ime studenta: " << endl;
getline(input, ime);
cout << endl;
cout << "Unesite prezime studenta: " << endl;
getline(input, prezime);
cout << endl;
cout << "*** Uspjesno ste unijeli studenta ***" << endl;
return input;
}
所以我正在尝试检查为结构成员 brojIndeksa
输入的值是否已经存在于 vector 中,但我不确定该怎么做。
还有我如何向地图添加值,因为我需要添加对 ,但不确定如何添加,因为我需要检查 STRING
是否是在 [=13 中输入的值=] 在 predmeti
向量中?
谢谢。
首先,您可以检查 std::vector 的计数以查看给定的键是否存在
//std::count(v.begin(), v.end(), key)
if (std::count(v.begin(), v.end(), key)){
//it is inside
}
else{
//it isn't inside
}
这是一种方法,但你应该做地图
std::map<std::string,int> myMap;
//adding will look like this
std::pair<std::string,int> element;
myMap.insert(element);
//or
myMap.insert(std::pair<std::string,int>(myString,myInt));
将解决您的问题。您添加一对字符串和整数。
为了检查给定的密钥是否存在,你可以做
std::map<std::string, int> m;
if ( m.find(key) == m.end() ) {
// not found
} else {
// found
}
添加了 Kyle 注释,因为它是有效的方式,而且看起来更清晰,您还可以像这样查找元素是否存在
if (m.count(key)){
//key found
}
else{
//key not found
}
PS。使用 c++ using namespace std;
是不好的做法。您应该始终使用 std::whatever_you_need
而不是
关于检查学生的第一个问题:您可以在输入后添加此搜索。
auto clean_buf = input.rdbuf()
....
auto resit = std::find_if(v.begin(), v.end(),
[&](auto& student) {
return ( student.brojIndeska == brojIndeska)
});
if(resit != v.end()) {//student exists
input.rdbuf(clean_buf);
return input;
}
对于第二个,您可以使用
添加到地图
map.emplace(var1, var2)
所以我正在为这些事情苦苦挣扎:
我有方法 returns istream 输入并将 istream 输入作为参数,将值发送到 vector 并将它们存储在其中。现在,当我输入 1 个值时,我试图检查 vector 是否已经包含该值,这里是我的代码以更好地理解它:
struct Predmet {
string naziv;
string odsjek;
istream& dodaj_predmet(istream &);
};
struct Student {
string brojIndeksa;
string ime;
string prezime;
map<std::string, int> ocjene;
istream& dodaj_studenta(istream &);
};
vector<Student> studenti;
vector<Predmet> predmeti;
Student s;
Predmet p;
istream& Student::dodaj_studenta(istream & input){
cout << "### Unesite podatke o studentu: " << endl;
cout << endl;
cout << "Unesite broj indeksa studenta: " << endl;
getline(input, brojIndeksa);
cout << endl;
cout << "Unesite ime studenta: " << endl;
getline(input, ime);
cout << endl;
cout << "Unesite prezime studenta: " << endl;
getline(input, prezime);
cout << endl;
cout << "*** Uspjesno ste unijeli studenta ***" << endl;
return input;
}
所以我正在尝试检查为结构成员 brojIndeksa
输入的值是否已经存在于 vector 中,但我不确定该怎么做。
还有我如何向地图添加值,因为我需要添加对 STRING
是否是在 [=13 中输入的值=] 在 predmeti
向量中?
谢谢。
首先,您可以检查 std::vector 的计数以查看给定的键是否存在
//std::count(v.begin(), v.end(), key)
if (std::count(v.begin(), v.end(), key)){
//it is inside
}
else{
//it isn't inside
}
这是一种方法,但你应该做地图
std::map<std::string,int> myMap;
//adding will look like this
std::pair<std::string,int> element;
myMap.insert(element);
//or
myMap.insert(std::pair<std::string,int>(myString,myInt));
将解决您的问题。您添加一对字符串和整数。 为了检查给定的密钥是否存在,你可以做
std::map<std::string, int> m;
if ( m.find(key) == m.end() ) {
// not found
} else {
// found
}
添加了 Kyle 注释,因为它是有效的方式,而且看起来更清晰,您还可以像这样查找元素是否存在
if (m.count(key)){
//key found
}
else{
//key not found
}
PS。使用 c++ using namespace std;
是不好的做法。您应该始终使用 std::whatever_you_need
而不是
关于检查学生的第一个问题:您可以在输入后添加此搜索。
auto clean_buf = input.rdbuf()
....
auto resit = std::find_if(v.begin(), v.end(),
[&](auto& student) {
return ( student.brojIndeska == brojIndeska)
});
if(resit != v.end()) {//student exists
input.rdbuf(clean_buf);
return input;
}
对于第二个,您可以使用
添加到地图map.emplace(var1, var2)