Вектор поиска структур - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь найти строку внутри вектора структур. Но я получаю сообщение об ошибке, сообщение об ошибке слишком длинное, поэтому я загружу его извне. Частично это

"ошибка: нет совпадения для оператора == (типы операндов: 'char' и 'const std :: __cxx11 :: basic_string') {return * __ it == _M_value;} "

Код, который я сейчас использую:

struct constants {
    std::string name, lastname;
    float salary=0;
};

void searchPerson(const std::vector<constants> &search) {
    using namespace std;
    vector<constants>name;
    string searchTerm;
    cout << "Enter last name of the person you wish you lookup." << "\n";
    cin >> searchTerm;
for (size_t k=0; k<name.size(); k++){
    if (std::find(name[k].lastname.begin(), name[k].lastname.end(), searchTerm) != name[k].lastname.end())
    {
        cout << "Test" << "\n";
    }
  }
}

Я просто не могу заставить его работать, я не знаю, в чем дело. Конечная цель - позволить пользователю ввести фамилию человека, если в программе сохранен человек с этой фамилией, он напечатает всю информацию об этом человеке (имя, фамилия и зарплата). Я, вероятно, также буду использовать ту же технику поиска, чтобы удалить человека из программы.

Я могу легко заставить его работать, просто используя for для l oop, но определенно должна быть причина для использования найти синтаксис, ниже чудеса работы фрагмента.

for (size_t i=0; i<name.size(); i++) {
    if (name[i].lastname== searchTerm)
        cout << "Test" << "\n";
}

https://pastebin.com/mk0pTWgr

1 Ответ

1 голос
/ 17 января 2020

Не делает то, что вы думаете. Это для l oop, который повторяет вектор constants и пытается искать в пределах lastname каждого отдельного constants объекта. Я не думаю, что вы хотите это сделать. Вы можете просто сравнить lastname с searchTerm следующим образом:

for (size_t k = 0; k < name.size(); k++) {
    if (name[k].lastname == searchTerm)
    {
        std::cout << "Test" << "\n";
        break;
    }
}

Однако ручной сборки для циклов лучше избегать с коллекциями stl, такими как std::vector. Вы можете использовать std::find, но это будет использовать operator == в вашей структуре. Вам придется либо предоставить, либо вместо этого использовать std::find_if и предоставить функцию предиката для сравнения:

if (std::find_if(name.cbegin(), name.cend(),
        [&searchTerm](const constants& c) { return searchTerm == c.lastname; }) != name.end())
{
    std::cout << "Test" << "\n";
}

Это позволит избежать использования a для l * 1024. *. Обратите внимание, что лямбда-функция - это предикат, который захватывает ваш searchTerm по ссылке и сравнивает его только с lastname.

...