как вернуть индекс из функции?

#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 ];
  

перед удалением этого элемента (если вы не используете интеллектуальные указатели ;).