#c #function #return
#c #функция #Возврат
Вопрос:
Я работаю над программой телефонной книги. Мне нужно использовать позицию, возвращаемую моей функцией findContact, и использовать ее в качестве индекса в моей функции deleteContact.
void AddressBook::deleteContact(std::string nameMatch) //need to implement find contact amp;amp; not found if there is a space at end of name
{
if (length == 0)
{
std::cout << "Phonebook is empty" << std::endl;
return;
}
findContact(nameMatch);
std::cout << phoneBook[position]->name << " deleted" << std::endl;
phoneBook[position] = phoneBook[length - 1]; //how to use position
length--;
return;
}
Я использую двоичный поиск, потому что он проинструктирован моим профессором.
int AddressBook::findContact(std::string nameMatch)
{
int first = 0;
int last = length - 1;
int middle;
int position = -1;
bool found = false;
while (!found amp;amp; first <= last)
{
middle = (first last) / 2;
if (phoneBook[middle]->name == nameMatch)
{
found = true;
position = middle;
}
else if (phoneBook[middle]->name > nameMatch)
{
last = middle - 1;
}
else
{
first = middle 1;
}
}
return position;
}
Это в основном неполно, но я пытаюсь выяснить, как использовать позицию
возвращается из моей функции findContact и использует ее в моем deleteContact.
Ответ №1:
Сохраните возвращаемое значение в локальной переменной.
auto position = findContact(nameMatch);
Ответ №2:
Я не совсем уверен, что вы подразумеваете под как использовать position. Если ваша проблема заключается в том, как вы технически получаете позицию из вашего метода find в ваш метод delete, ответ @DeviationN — это ваше решение.
Но, возможно, вы спрашиваете, как выполнить удаление в вашем контейнере телефонной книги (вероятно, это вектор?). Что вы сделали, так это перезаписали свою запись, чтобы она была удалена последней записью в вашей телефонной книге. Однако это нарушит порядок сортировки (в большинстве случаев). Но если вы используете двоичный поиск, необходимым условием является сортировка вашей телефонной книги.
Вместо этого удалите свою запись в позиции через
phoneBook.erase( phonebook.cbegin() position );
end либо уменьшите вашу длину, как вы это делали, либо сбросьте ее следующим образом
length = phoneBook.size();
(Здесь я предположил, что телефонная книга — это std::vector или std::deque)
Редактировать: Я только что заметил, что телефонная книга — это контейнер указателей, поэтому не забудьте сделать
delete phoneBook[ position ];
перед удалением этого элемента (если вы не используете интеллектуальные указатели ;).