提问者:小点点

如何实现此函数的while循环


我正在做一个学校的项目,在那里我们将制作一个联系簿。在其中一个函数中,它必须使用名字查找联系人。

出现的错误是它只显示向量中的一个联系人。我希望显示具有相同名称的所有联系人。

我如何实现一个循环或计数器(I++),以便它包括所有具有相同名称的联系人,而不只是采取第一个索引?

我是C++的新手,感谢所有的帮助:)

我的功能:

int findTargetFirstName(vector<Kontaktbok>& bok, string target) {
  for (int i = 0; i < bok.size(); i++)
    if (bok[i].fnamn == target) return i;
  return -1;

void search(vector<Kontaktbok>& bok) {
  if (bok.size() > 0) {
    string firstname;
    cout << "First name of the contact: ";
    getline(cin, firstname);
    int pos = findTargetFirstName(bok, firstname); 
    cout << "Firstname, Lastname, Address, Pnummer, E-post, Telefonnummer" << endl;
    if (pos>=0) {
      cout << left;
      cout << setw(10) << bok[pos].fnamn << left
           << setw(15) << bok[pos].enamn << left
           << setw(20) << bok[pos].adress << left
           << setw(15) << bok[pos].pnummer <<left
           << setw(25) << bok[pos].epost <<left
           << setw(15) << bok[pos].telnummer << left << endl;
    }
    cout << "********************************************************************************" << endl;
  }
}

共1个答案

匿名用户

一种方法是添加一个参数来确定从哪个元素开始。

int findTargetFirstName(vector<Kontaktbok>& bok, string target, int start = 0) {
    for (int i = start; i < bok.size(); i++)
        if (bok[i].fnamn == target) return i;
    return -1;
}


void search(vector<Kontaktbok>& bok) {
    if(bok.size() > 0) {
        string firstname;
        cout << "First name of the contact: ";
        getline(cin, firstname);
        int pos = findTargetFirstName(bok, firstname);
        cout << "Firstname, Lastname, Address, Pnummer, E-post, Telefonnummer" << endl;
        while (pos>=0){ // change if to while
            cout << left;
            cout << setw(10) << bok[pos].fnamn << left
            << setw(15) << bok[pos].enamn << left
            << setw(20) << bok[pos].adress << left
            << setw(15) << bok[pos].pnummer <<left
            << setw(25) << bok[pos].epost <<left
            << setw(15) << bok[pos].telnummer << left << endl;
            pos = findTargetFirstName(bok, firstname, pos + 1); // search for next contact
        }
        cout << "********************************************************************************" << endl;
    }
}

另一种方法是让函数返回满足条件的联系人向量。

vector<int> findTargetFirstName(vector<Kontaktbok>& bok, string target) {
    vector<int> ret;
    for (int i = start; i < bok.size(); i++)
        if (bok[i].fnamn == target) ret.push_back(i);
    return ret;
}


void search(vector<Kontaktbok>& bok) {
    if(bok.size() > 0) {
        string firstname;
        cout << "First name of the contact: ";
        getline(cin, firstname);
        vector<int> poses = findTargetFirstName(bok, firstname); // change type and variable
        cout << "Firstname, Lastname, Address, Pnummer, E-post, Telefonnummer" << endl;
        for (int pos : poses){ // change if to range-based for
            cout << left;
            cout << setw(10) << bok[pos].fnamn << left
            << setw(15) << bok[pos].enamn << left
            << setw(20) << bok[pos].adress << left
            << setw(15) << bok[pos].pnummer <<left
            << setw(25) << bok[pos].epost <<left
            << setw(15) << bok[pos].telnummer << left << endl;
        }
        cout << "********************************************************************************" << endl;
    }
}