【问题标题】:Check if a vector contains object with already entered values检查向量是否包含已输入值的对象
【发布时间】:2021-08-31 13:06:28
【问题描述】:

所以我正在为这些事情苦苦挣扎:

我有一个方法,它返回 istream 输入并将 istream 输入作为参数,将值发送到向量并将它们存储在其中。现在,当我输入 1 个值时,我正在尝试检查向量是否已经包含该值,这是我的代码以更好地理解它:

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 输入的值是否已经存在于向量中,但我不知道该怎么做。

另外我怎样才能将值添加到映射,因为我需要添加pair,但不确定如何,因为我需要检查STRING 是否是nazivpredmeti 中输入的值向量?

谢谢。

【问题讨论】:

标签: c++ c++11 vector structure istream


【解决方案1】:

首先,您可以检查 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 代替

【讨论】:

  • mapset 还有一个count 函数,可用于检查键/元素是否存在。如果您不打算使用 find 返回的迭代器(m.count(key) != 0 而不是 m.count(key) != m.end()),那么重复使用会少一些。
  • @Jarod42 std::map<:string int> 对不起,我刚刚添加了解释
【解决方案2】:

关于检查学生的第一个问题:您可以在输入后添加此搜索。

    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)

【讨论】:

  • 好的,看来这对我有用,谢谢。还有一个问题,现在如何退出函数并调用另一个函数?就像如果 brIndeksa 存在,我需要返回主菜单,但是当我这样做时,它仍然会打印出其他数据输入的行(ime,prezime)。
  • 您可以将其设置为 if else 块。因此,如果 resit 不等于 v.end(),即学生存在,则返回当前输入,甚至附加一个错误,说明学生存在。如果您不关心输入并且只想重置为原始缓冲区,则可以在开始时保存 istream.rdbuf() 并在提前返回之前将其重置。我会尝试在上面的答案中添加一个 sn-p。
  • 抛出错误后我不需要我的输入,我只是希望它从头开始重新开始,以便可以删除输入。
  • 听起来你需要一个循环来遍历输入。我认为这属于您的结构之外
  • @Dusan 是的,但是根据 OP 发布的代码,我不知道他是如何与结构交互的。他的代码对于最初的问题来说已经足够了,但对于他提早退出并继续的评论来说还不够。
猜你喜欢
  • 2017-08-04
  • 2022-11-09
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 2019-07-04
相关资源
最近更新 更多